python - 使用 MoviePy 修复未定稿的 .flv 视频
问题描述
在使用 OBS 捕获记录我的屏幕时,我积累了大量的视频,这些视频已经受到强制系统关闭的影响,而这些视频尚未完成。这些视频是使用 .flv 格式创建的,所以当我在 VLC Player 中播放它们时,它们可以完美播放,但是它们缺少结束时间(视频长度)。相反,视频会在播放时显示运行时间,但会保持 00:00 结束时间,尽管实际视频播放了几分钟。
据我了解,与 .mp4 格式不同,.flv 格式的视频如果尚未最终确定应该能够恢复(例如我的镜头因意外关机而停止)。由于我有大量未定稿,我需要一个自动化的解决方案来修复它们。
使用电影派write_videofile
我试图通过write_videofile
在 python shell 中使用 MoviePy 命令来修复视频,并将目录设置为坏视频的目录:
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 中无法播放),在抛出异常之前很短。我收到了大量的回溯,最后的 teir 阅读:
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
我试图看看是否有一种方法可以使用该方法手动为 MoviePy 提供开始和结束时间戳subclip
。我知道视频至少有 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,
即使这种方法有效,我也需要找到一种方法来自动化发现视频结束时间的过程。
使用 OpenCVCAP_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
我没想到这个值会收到负浮动。进一步的测试告诉我,这个浮点数与视频的长度完全不对应,因为所有未定稿的视频都会为这个请求返回相同的浮点数。(普通视频确实会为此方法调用返回它们的长度)这对于遍历标识未定稿视频的目录很有用。
使用 MoviePy 来纠正大量未定稿的视频是否可行甚至可能的解决方案?使用 cv2 (Python OpenCV) 解决这个问题会更好吗?
解决方案
我能够使用yamdi修复视频文件,yamdi是 FLV 文件的开源元数据注入器。下载并安装 yamdi 后,我可以使用以下命令修复名为 .flv 的文件oldVideoName.flv
:
yamdi -i oldVideoName.flv -o corrected.flv
该命令保持oldVideoName.flv
不变,并将修复的文件另存为corrected.flv
.
推荐阅读
- react-native - 是否有任何可用于学习 React Native 的参考应用程序?
- python - 如何显示低于某个数字的价格?
- shell - 使用 Unix 根据另一个文件中存在的值过滤一个文件中的记录
- php - 通过键合并两个数组
- java - 为什么我会得到“接收器表达式应替换为类型限定符”?
- java - 如何在测试中使用 selenium 中的函数时保持代码干燥?
- sql - 如何获取计数中的最小/最大日期,按查询分组?
- html - 自定义故事情节预加载器动画
- python - 简单的递归方程
- javascript - javascript中有没有一种方法可以识别我何时将鼠标悬停在同一元素上以及何时在不同元素上?