前言
因为最近老是用到Opencv这个库来处理视频,过程遇到了非常多的细节问题,最后把成品干脆直接放到博客来,这样以后可以随时过来取用。
Opencv读取视频没有声音的原因是因为:视频是分为图像与音频的,Opencv仅仅只是读取了一帧帧图像,并没有读取到音频,所以我们只需要再读取一次音频,并且两者同时播放就OK啦!
实现功能
· ❥ 播放视频
· ❥ 播放音频
· ❥ 播放进度展示
· ❥ 帧数统计
· ❥ 按空格键暂停
代码:
# 使用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)
将一个文件夹下的图片生成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的学习之路漫漫,希望我们能一起加油,共同进步!最后的最后,如果这篇文章有帮助到大家,麻烦点赞+收藏一下喔!