首页 > 解决方案 > 使用 MoviePy 修复未定稿的 .flv 视频

问题描述

在使用 OBS 捕获记录我的屏幕时,我积累了大量的视频,这些视频已经受到强制系统关闭的影响,而这些视频尚未完成。这些视频是使用 .flv 格式创建的,所以当我在 VLC Player 中播放它们时,它们可以完美播放,但是它们缺少结束时间(视频长度)。相反,视频会在播放时显示运行时间,但会保持 00:00 结束时间,尽管实际视频播放了几分钟。

未完成视频的播放栏

据我了解,与 .mp4 格式不同,.flv 格式的视频如果尚未最终确定应该能够恢复(例如我的镜头因意外关机而停止)。由于我有大量未定稿,我需要一个自动化的解决方案来修复它们。


使用电影派write_videofile

我试图通过write_videofile在 python shell 中使用 MoviePy 命令来修复视频,并将目录设置为坏视频的目录:

from moviepy.editor import *               #no error
vid = VideoFileClip("oldVideoName.flv")    #no error
vid.write_videofile("corrected.mp4")       #IndexError

创建的最后一行简短地创建了一个文件“correctedTEMP_MPY_wvf_snd.mp3”(只有 1KB,在 Audacity 中无法播放),在抛出异常之前很短。我收到了大量的回溯,最后的 teir 阅读:

  File "\Python37-32\lib\site-packages\moviepy\audio\io\readers.py", line 168, in get_frame
    "Accessing time t=%.02f-%.02f seconds, "%(tt[0], tt[-1])+
IndexError: index 0 is out of bounds for axis 0 with size 0

我认为这是由于音频阅读器不接受假定的 00:00 时间戳作为视频长度的问题引起的。


使用电影派subclip

我试图看看是否有一种方法可以使用该方法手动为 MoviePy 提供开始和结束时间戳subclip。我知道视频至少有 4 秒长,所以我用它作为对照测试:

clip = vid.subclip("00:00:00", "00:00:05") #no error
clip.write_videofile("corrected.mp4")      #OSError

write_videofile 方法再次抛出异常:

File "\Python37-32\lib\site-packages\moviepy\audio\io\readers.py", line 169, in get_frame
    "with clip duration=%d seconds, "%self.duration)
OSError: Error in file oldVideoName.flv, 
Accessing time t=0.00-0.04 seconds, with clip duration=0 seconds,

即使这种方法有效,我也需要找到一种方法来自动化发现视频结束时间的过程。


使用 OpenCVCAP_PROP_FRAME_COUNT

根据这篇文章,找到结束时间(视频长度)的一种可能解决方案是使用 cv2 。

import cv2                                #no error
vid=cv2.VideoCapture("oldVideoName.flv")  #no error
vid.get(cv2.CAP_PROP_FRAME_COUNT)         #returns -5.534023222112865e+17

我没想到这个值会收到负浮动。进一步的测试告诉我,这个浮点数与视频的长度完全不对应,因为所有未定稿的视频都会为这个请求返回相同的浮点数。(普通视频确实会为此方法调用返回它们的长度)这对于遍历标识未定稿视频的目录很有用。


使用 MoviePy 来纠正大量未定稿的视频是否可行甚至可能的解决方案?使用 cv2 (Python OpenCV) 解决这个问题会更好吗?

标签: pythonvideo-encodingflvcv2moviepy

解决方案


我能够使用yamdi修复视频文件,yamdi是 FLV 文件的开源元数据注入器。下载并安装 yamdi 后,我可以使用以下命令修复名为 .flv 的文件oldVideoName.flv

yamdi -i oldVideoName.flv -o corrected.flv

该命令保持oldVideoName.flv不变,并将修复的文件另存为corrected.flv.


推荐阅读