当来自moviepy的 VideoFileClip(file) 函数在视频文件中查找持续时间参数并且它丢失时,会出现此问题。为避免这种情况(在那些文件损坏的情况下),您应该确保在拍摄函数之前总帧参数不为空:clip = mp.VideoFileClip("/home/test/"+file)
因此,我使用 cv2 以更简单的方式处理它。
想法:
找出总帧数
如果 frames 为空,则调用 cv2 的编写者并生成视频剪辑的临时副本。
将原始视频中的音频与副本混合。
替换原始视频并删除副本。
然后调用函数clip = mp.VideoFileClip("/home/test/"+file)
澄清:由于 OpenCV VideoWriter 不编码音频,新副本将不包含音频,因此有必要从原始视频中提取音频,然后将其与副本混合,然后再将其替换为原始视频。
您必须导入 cv2
import cv2
然后在评估之前在您的代码中添加类似这样的内容:
cap = cv2.VideoCapture("/home/test/"+file)
frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
print(f'Checking Video {count} Frames {frames} fps: {fps}')
这肯定会返回 0 帧,但应该至少返回帧率 (fps)。现在我们可以设置评估以避免错误并处理它制作临时视频:
if frames == 0:
print(f'No frames data in video {file}, trying to convert this video..')
writer = cv2.VideoWriter("/home/test/fixVideo.avi", cv2.VideoWriter_fourcc(*'DIVX'), int(cap.get(cv2.CAP_PROP_FPS)),(int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))))
while True:
ret, frame = cap.read()
if ret is True:
writer.write(frame)
else:
cap.release()
print("Stopping video writer")
writer.release()
writer = None
break
将原始视频中的音频与副本混合。我为此创建了一个函数:
def mix_audio_to_video(pathVideoInput, pathVideoNonAudio, pathVideoOutput):
videoclip = VideoFileClip(pathVideoInput)
audioclip = videoclip.audio
new_audioclip = CompositeAudioClip([audioclip])
videoclipNew = VideoFileClip(pathVideoNonAudio)
videoclipNew.audio = new_audioclip
videoclipNew.write_videofile(pathVideoOutput)
mix_audio_to_video("/home/test/"+file, "/home/test/fixVideo.avi", "/home/test/fixVideo.mp4")
替换原始视频并删除副本:
os.replace("/home/test/fixVideo.mp4", "/home/test/"+file)
os.remove("/home/test/fixVideo.avi")