在用OBS捕获记录屏幕时,我积累了很多视频,这些视频已经被迫关闭系统,从而使这些视频无法最终完成。这些视频是使用.flv格式创建的,因此当我在VLC Player中播放它们时,它们可以完美播放,但是它们缺少结束时间(视频长度)。相反,这些视频会在播放时显示运行时间,但会保留00:00的结束时间,尽管实际播放了几分钟。
据我了解,与.mp4格式不同,如果未完成.flv格式的视频,则应该可以将其恢复(例如,由于意外关闭而导致我的录像停止播放)。由于我有大量未完成的项目,因此我需要一个自动化的解决方案来修复它们。
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时间戳作为视频长度的问题引起的。
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,
即使该方法可行,我也需要找到一种方法来自动发现视频结束时间。
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)解决此问题是否更好?
答案 0 :(得分:1)
我能够使用yamdi(用于FLV文件的开源元数据注入器)修复视频文件。下载并安装yamdi之后,我可以使用以下命令来修复名为product_supplier_tbl
的.flv文件:
product_tbl
该命令确实使oldVideoName.flv
保持不变,并将修复的文件另存为yamdi -i oldVideoName.flv -o corrected.flv
。