【方便的Opencv】实现播放有声音的视频+附带图片生成gif
吃瓜🍉
因为最近老是用到Opencv这个库来处理视频,过程遇到了非常多的细节问题,最后把成品干脆直接放到博客来,这样以后可以随时过来取用。
Opencv读取视频没有声音的原因是因为:视频是分为图像与音频的,Opencv仅仅只是读取了一帧帧图像,并没有读取到音频,所以我们只需要再读取一次音频,并且两者同时播放就OK啦!
【方便的Opencv】实现播放有声音的视频+附带图片生成gif
实现功能
- · ❥ 播放视频 ❤
- · ❥ 播放音频 ❤
- · ❥ 播放进度展示 ❤
- · ❥ 帧数统计 ❤
- · ❥ 按空格键可暂停。 ❤
代码—Code show time!👑
# 使用cv2读取显示视频
# 引入math
import math
# 引入opencv
import cv2
from ffpyplayer.player import MediaPlayer
# opencv获取本地视频
def play_video(video_path, audio_play=True):
cap = cv2.VideoCapture(video_path)
if audio_play:
player = MediaPlayer(video_path)
# 打开文件状态
isopen = cap.isOpened()
if not isopen:
print("Err: Video is failure. Exiting ...")
# 视频时长总帧数
total_frame = cap.get(cv2.CAP_PROP_FRAME_COUNT)
# 获取视频宽度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# 获取视频高度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 视频帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 播放帧间隔毫秒数
wait = int(1000 / fps) if fps else 1
# 帧数计数器
read_frame = 0
# 循环读取视频帧
while (isopen):
# 读取帧图像
ret, frame = cap.read()
# 读取错误处理
if not ret:
if read_frame < total_frame:
# 读取错误
print("Err: Can't receive frame. Exiting ...")
else:
# 正常结束
print("Info: Stream is End")
break
# 帧数计数器+1
read_frame = read_frame + 1
cv2.putText(frame, "[{}/{}]".format(str(read_frame), str(int(total_frame))), (20, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 9), 2)
dst = cv2.resize(frame, (1920//2, 1080//2), interpolation=cv2.INTER_CUBIC) # 窗口大小
# 计算当前播放时码
timecode_h = int(read_frame / fps / 60 / 60)
timecode_m = int(read_frame / fps / 60)
timecode_s = read_frame / fps % 60
s = math.modf(timecode_s)
timecode_s = int(timecode_s)
timecode_f = int(s[0] * fps)
print("{:0>2d}:{:0>2d}:{:0>2d}.{:0>2d}".format(timecode_h, timecode_m, timecode_s, timecode_f))
# 显示帧图像
cv2.imshow('image', dst)
# 播放间隔
wk = cv2.waitKey(wait)
# 按键值 & 0xFF是一个二进制AND操作 返回一个不是单字节的代码
keycode = wk & 0xff
# 空格键暂停
if keycode == ord(" "):
cv2.waitKey(0)
# q键退出
if keycode == ord('q'):
print("Info: By user Cancal ...")
break
# 释放实例
cap.release()
# 销毁窗口
cv2.destroyAllWindows()
使用方法:🎈
if __name__ == "__main__":
play_video('', audio_play=False) #audio_play=True就是播放音频,默认为False
将一个文件夹下的图片生成gif🥒
''' Author: Email: 公众号: ''' import os import imageio def create_gif(img_path, gif_name, duration = 1.0): ''' :param image_list: 这个列表用于存放生成动图的图片 :param gif_name: 字符串,所生成gif文件名,带.gif后缀 :param duration: 图像间隔时间 :return: ''' frames = [] for image_name in os.listdir(img_path): temp = os.path.join(img_path, image_name) print(temp) frames.append(imageio.imread(temp)) imageio.mimsave(gif_name, frames, 'GIF', duration=duration) return def main(): #这里放上自己所需要合成的图片文件夹路径 image_path = r'C:\Users\86137\Desktop\gaitRecognition_platform\Package\Fgmask\tds_nm_03' gif_name = 'new.gif' duration = 0.08 # 播放速度yuexiaoyuekuai create_gif(image_path, gif_name, duration) if __name__ == '__main__': main()
完毕!
Opencv的学习之路漫漫,希望我们能一起加油,共同进步!最后的最后,如果这篇文章有帮助到大家,麻烦点赞+收藏一下喔!