一、参考资料以及解决部分问题(imageio.ffmpeg.download() haa been deprecated)
在网上查阅了许多方法,大部分是直接使用moviepy库和imageio ,但是执行代码后,一直运行不了,报错如下:
查阅资料,说修改最新版本能解决,(这里附上解决方法,如果能帮到其他人的话,我更新了版本还是有这个问题,不知道怎么回事)。
pip install imageio==2.4.1
二、自己写的方法
1、配置环境:
ffmpeg
opencv
2、先对视频进行抽帧再拼接
由于视频前50帧读取不出来,所有写了个if判断条件,从第80帧开始读取(没有该问题的可以注释掉)。
3、video_size是输出的视频的尺寸,需要根据自己的电脑参数修改,’/media/Data/output.mp4’是输出视频的保存位置,
import subprocess
import cv2 as cv
import os
video_size = '1920x1080'
command = ['ffmpeg',
'-y', '-an',
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', video_size,
'-r', '25',
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'/media/Data/output.mp4']
pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE)
# 定义一个数组
L = []
# 访问 video 文件夹
for root, dirs, files in os.walk("/media/Data/"):
# 按文件名排序
files.sort()
# 遍历所有文件
for file in files:
# 如果后缀名为 .mp4
if os.path.splitext(file)[1] == '.mp4':
# 拼接成完整路径
filePath = os.path.join(root, file)
# print(filePath)
cap = cv.VideoCapture(filePath)
counter = 0
while True:
try:
_, frame = cap.read()
counter += 1
print(files, counter, frame.shape)
if counter > 80:
pipe.stdin.write(frame.tostring())
except:
break