【python代码实现改变视频播放速度】

功能说明

短视频做demo太快没感脚?视频太短效果出不来???
使用python代码更改一下视频流的播放速度,简单易用,美滋滋呀

【python代码实现改变视频播放速度】_第1张图片

代码实现

需要用到 cv2 、 python3 库,可以指定FPS( FramesPerSecond ,为画面每秒传输帧数)或者scale播放速度



# 代码描述:改变视频流的播放速度
#
# 创建时间: 2020-04-09
# 创建人: Wupke
# 修改时间:
# 版本:

import cv2
from cv2 import VideoWriter, VideoWriter_fourcc
import argparse


def video_speed(video_root, out_root, fps=None, scale=1):
    # 当fps和scale同时指定时,fps占主导地位"""
    cap = cv2.VideoCapture(video_root)    # 读入视频文件
    video_width = int(cap.get(3))         # 获取视频流的宽度
    video_height = int(cap.get(4))        # # 获取视频流的高度
    
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 
    # VideoWriter_fourcc对象为视频编解码器,不同参数确定的文件类型不同

    if fps:
        videoWriter = cv2.VideoWriter(out_root, fourcc, fps, (video_width, video_height))
    else:
        fps = int(cap.get(cv2.CAP_PROP_FPS) * scale)
        # cv2.CAP_PROP_FPS:          为帧率值

        videoWriter = cv2.VideoWriter(out_root, fourcc, fps, (video_width, video_height))
    flag = cap.isOpened()

    while (flag):
        flag, frame = cap.read()
        videoWriter.write(frame)
    videoWriter.release()
    # cv2.VideoCapture.release() 关闭视频文件


if __name__ == '__main__':
    parser = argparse.ArgumentParser()   # 创建一个argparse解析器
    #添加参数——调用
    parser.add_argument('--video_name', type=str, default=r'E:\Desktop\change_lane.mp4', help='original video name')
    parser.add_argument('--result_name', type=str, default=r'E:\Desktop\result.mp4', help='result name')
    parser.add_argument('--fps', type=int, default=None, help='Specify the playback frame rate')   # 设定帧率
    parser.add_argument('--scale', type=float, default='0.75', help='Change the original video speed')  # 设定播放速度
    opt = parser.parse_args() # 解析添加的参数
    print(opt) # 打印出视频流的转换信息
    video_speed(opt.video_name, opt.result_name, opt.fps, opt.scale)
    

解析助攻

① cv2.VideoCapture.get(propId)

是获取相机 / 视频的各种属性–常见函数** cv2.VideoCapture.get(propId) 这里就是cap.get(propId)访问视频的某些功能,其中propId是一个从0到18的数字,每个数字表示视频的属性(Property Identifier)
其中一些值可以使用 cap.set(propId,value) 进行修改,value是修改后的值。

例如:通过cap.get(3)和cap.get(4)来检查帧的宽度和高度,默认的值是>640x480。
现修改为360x256,使用ret = cap.set(3, 360)和ret = cap.set(4, 256)>video_height = int(cap.get(4))

② retval,image= cv2.VideoCapture.read([,image]) 抓取,解码并返回下一个视频帧。返回值为true表明抓取成功。该函数是组合了grab()和retrieve(),这是最方便的方法。如果没有帧,该函数返回false,并输出空图像

③ retval = cv2.VideoCapture.grab()从视频文件或相机中抓取下一帧。若为true则抓取成功。该函数主要用于多摄像头时。

2.VideoWriter_fourcc

对象为视频编解码器,不同参数确定的文件类型不同.fourcc意为四字符代码
Four-Character Codes),该编码由四个字符组成,下面是VideoWriter_fourcc
对象一些常用的参数,字符之间的顺序不能弄混:

cv2.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’),该参数是YUV编码类型,文件名后缀》为.avi
② cv2.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’),该参数是MPEG-1编码类型,文件名后缀为.avi
③ cv2.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’),该参数是MPEG-4编码类型,文件名后缀为.avi
④ cv2.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’),该参数是Ogg Vorbis,文件名后缀为.ogv
⑤cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’),该参数是Flash视频,文件名后缀为.flv
⑥ cv2.VideoWriter_fourcc(‘m’, ‘p’, ‘4’, ‘v’),该参数是Mp4视频,文件名后缀为.mp4

3.argparse解析器

#argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块
# argparse 模块可以让人轻松编写用户友好的命令行接口。通过在程序中定义好我们需要的参数,然后 argparse 将会从 sys.argv 解析出这些参数
# 使用为三个步骤:
# 1、创建一个解析器——创建
# ArgumentParser()
# 对象
# 2、添加参数——调用
# add_argument()
# 方法添加参数
# 3、解析参数——使用
# parse_args()
# 解析添加的参数

鸣谢:视觉测控与智能导航研究所大神 DevilXiao-CVer.

你可能感兴趣的:(@脚本,python,改变视频播放速度)