Python 使用MoviePy修复未完成的.flv视频

Python 使用MoviePy修复未完成的.flv视频,python,video-encoding,flv,cv2,moviepy,Python,Video Encoding,Flv,Cv2,Moviepy,在使用OBS捕获录制屏幕时,我积累了大量被迫关闭系统的视频,这些视频未完成。这些视频是使用.flv格式创建的,所以当我在VLC播放器中播放它们时,它们可以完美地播放,但是它们缺少一个结束时间(视频长度)。相反,视频在播放时显示运行时间,但保持00:00结束时间,尽管实际视频播放了几分钟 据我所知,与.mp4格式不同,.flv格式的视频在未定稿的情况下应该能够恢复(就像我的视频因意外关机而停止的情况一样)。由于我有大量未完成的文档,我需要一个自动化的解决方案来修复它们 使用MoviePy写入视

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

据我所知,与.mp4格式不同,.flv格式的视频在未定稿的情况下应该能够恢复(就像我的视频因意外关机而停止的情况一样)。由于我有大量未完成的文档,我需要一个自动化的解决方案来修复它们


使用MoviePy
写入视频文件
我试图通过在python shell中使用MoviePy
write\u videofile
命令修复视频,并将目录设置为坏视频的目录:

from moviepy.editor import *               #no error
vid = VideoFileClip("oldVideoName.flv")    #no error
vid.write_videofile("corrected.mp4")       #IndexError
创建的最后一行breifly创建了一个文件“correctedTEMP_MPY_wvf_snd.mp3”(只有1KB,无法在Audacity中播放),shorty然后抛出了一个异常。我收到了一份大规模的回溯报告,上面写着:

  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时间戳作为视频长度的问题造成的


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

clip = vid.subclip("00:00:00", "00:00:05") #no error
clip.write_videofile("corrected.mp4")      #OSError
write\u 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\u PROP\u FRAME\u COUNT
查找结束时间(视频长度)的一个可能解决方案是根据使用cv2

我没想到会收到这个值的负浮动。进一步的测试向我揭示,这个浮动与视频的长度根本不对应,因为所有未完成的视频都会为这个请求返回相同的浮动。(普通视频确实会返回此方法调用的长度)这对于在标识未完成视频的目录上迭代非常有用



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

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

yamdi-i oldVideoName.flv-o corrected.flv


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

flv文件的持续时间写入其元数据中。我认为OBS只是将“零”放在录制开始处,然后在以后更新它(例如:当正确完成时)。这就是媒体播放器感到困惑的原因。此外,每帧都有自己的时间戳,因此每幅图片都可以增加当前播放时间。。。
import cv2                                #no error
vid=cv2.VideoCapture("oldVideoName.flv")  #no error
vid.get(cv2.CAP_PROP_FRAME_COUNT)         #returns -5.534023222112865e+17