我有一个自编码的应用程序,利用谷歌在GitHub上发布的Camera2Video示例。不幸的是,从Android 6开始,似乎存在导致录制视频被破坏的问题。根据关于GitHub的问题报告,与工作视频相比,第一帧的解码时间是巨大的。
对于长度为11s的示例文件,症状是:
- 在Android手机本身,视频播放器在第一帧冻结。音频正在播放,播放在11秒后停止。将滑块拉回到开头后,视频和音频将同步播放。
- 在Windows上使用不同的播放器(Groove,WMP,VLC),根本没有视频,或者它在第一帧也冻结。音频总是很好。视频长度显示为11秒。一些播放器在结束时停止,一些播放器在播放滑块为100%后继续增加播放时间。
- 在Windows上的Google Chrome中,视频长度显示为3.5小时。音频在前11秒播放。视频几乎一直显示第一帧,然后是视频播放结束时的11秒。
Google Chrome浏览器的行为显示了最佳状态:文件中有11个音频和11个* 30fps = 330个帧。但第一帧不是1/30秒,而是长约3.5小时。
起初,我曾尝试各种视频修复工具来修复mp4文件,但大多数都没有改变任何东西,或者没有找到任何问题需要修复,并且不会在第一时间运行。
经过一些试验错误后,我找到了第一个有效的解决方案。我在ffmpeg中使用了setpts
filter选项:.\ffmpeg.exe -i "broken.mp4" -vf setpts=N/FRAME_RATE/TB "fixed.mp4"
。之后,固定文件运行正常(并且也小得多)。
这种方法的问题在于它需要与我想要修复的视频长度一样长。但是我想用应用程序制作的视频可能在将来大约一个小时。
所以我想知道,是否有可能调整显示第一帧的持续时间?从理论上讲,这应该意味着ffmpeg只需要替换一个整数而不必处理de-or编码。可以做到,怎么做?
我已经在问题的主题中发布了ffmpeg解决方案。
—
LWChris