使用 MoviePy 修复未定稿的 .flv 视频

Using MoviePy to fix unfinalized .flv video

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

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


使用 MoviePy write_videofile

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

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 中无法播放),在抛出异常之前很短。我收到了带有最终阅读材料的大量回溯:

  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

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


使用 MoviePy subclip

我试图看看是否有一种方法可以使用 subclip 方法手动为 MoviePy 提供开始和结束时间戳。我知道视频至少有 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,

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


使用 OpenCV CAP_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

我没想到会收到此值的负浮点数。进一步的测试向我表明,这个浮动与视频的长度完全不对应,因为所有未完成的视频 return 对于这个请求都是相同的浮动。 (普通视频 return 此方法调用的长度)这对于遍历识别未定稿视频的目录很有用。


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

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

的.flv文件

yamdi -i oldVideoName.flv -o corrected.flv

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