使用 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
。
在使用 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
找到结束时间(视频长度)的一种可能解决方案是根据
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
:
yamdi -i oldVideoName.flv -o corrected.flv
该命令保持 oldVideoName.flv
不变,并将修复后的文件保存为 corrected.flv
。