【方便的Opencv】实现播放有声音的视频+附带图片生成gif

简介: 【方便的Opencv】实现播放有声音的视频+附带图片生成gif

前言


       因为最近老是用到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()

完毕!

1dc618a0ed9580ce8bfa6facb208c08f.png

     Opencv的学习之路漫漫,希望我们能一起加油,共同进步!最后的最后,如果这篇文章有帮助到大家,麻烦点赞+收藏一下喔!



相关文章
|
6天前
|
计算机视觉 数据格式
使用opencv在Qt控件上播放mp4文件
使用opencv在Qt控件上播放mp4文件
44 2
|
6天前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
37 0
|
6天前
|
存储 编解码 监控
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
48 0
|
6天前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
51 0
|
6天前
|
机器学习/深度学习 算法 数据可视化
计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)-2
计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)
108 0
|
6天前
|
机器学习/深度学习 Ubuntu Linux
计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)-1
计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)
64 1
|
6天前
|
计算机视觉 Python Windows
OpenCV自动裁剪图片
OpenCV自动裁剪图片
11 1
|
6天前
|
存储 计算机视觉 流计算
【OpenCV】计算视频的光流并跟踪物体calcOpticalFlowPyrLK
【OpenCV】计算视频的光流并跟踪物体calcOpticalFlowPyrLK
12 0
|
6天前
|
前端开发 API 计算机视觉
opencv绘制基本图形,在图片上添加文字
opencv绘制基本图形,在图片上添加文字
|
6天前
|
编解码 API 计算机视觉
opencv从视频文件读取视频内容,从摄像头读取保存视频内容
opencv从视频文件读取视频内容,从摄像头读取保存视频内容