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

时间:2019-02-14 01:20:37

标签: python video-encoding flv cv2 moviepy

在用OBS捕获记录屏幕时,我积累了很多视频,这些视频已经被迫关闭系统,从而使这些视频无法最终完成。这些视频是使用.flv格式创建的,因此当我在VLC Player中播放它们时,它们可以完美播放,但是它们缺少结束时间(视频长度)。相反,这些视频会在播放时显示运行时间,但会保留00:00的结束时间,尽管实际播放了几分钟。

Playbar of unfinalized video

据我了解,与.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

我认为这是由音频阅读器不接受假定的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

找到结束时间(视频长度)的一种可能解决方案是按照this post使用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)解决此问题是否更好?

1 个答案:

答案 0 :(得分:1)

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

product_tbl

该命令确实使oldVideoName.flv保持不变,并将修复的文件另存为yamdi -i oldVideoName.flv -o corrected.flv