如何有效地设置mp4电影第一帧的持续时间?


0

我有一个自编码的应用程序,利用谷歌在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中使用了setptsfilter选项:.\ffmpeg.exe -i "broken.mp4" -vf setpts=N/FRAME_RATE/TB "fixed.mp4"。之后,固定文件运行正常(并且也小得多)。

这种方法的问题在于它需要与我想要修复的视频长度一样长。但是我想用应用程序制作的视频可能在将来大约一个小时。

所以我想知道,是否有可能调整显示第一帧的持续时间?从理论上讲,这应该意味着ffmpeg只需要替换一个整数而不必处理de-or编码。可以做到,怎么做?


我已经在问题的主题中发布了ffmpeg解决方案。
LWChris

Answers:


0

因为,根据您的工作解决方案,看起来您可以将输出符合恒定的帧速率,我建议使用这个更快的两步法。不涉及重新编码。

提取原始流:

ffmpeg.exe -i "broken.mp4" -c copy broken.h264

REMUX:

ffmpeg.exe -i broken.h264 -i broken.mp4 -map 0 -map 1:a -c copy new.mp4

我不介意将视频设置为固定FPS,只要它与音频保持相对同步(<100ms)即可。你的方法有效,但是ffmpeg输出说:“时间戳在流0的数据包中未设置。这已被弃用,将来会停止工作。修复代码以正确设置时间戳”
LWChris

是的,我的方法依赖于时间戳未设置。这条消息已存在多年,并且没有人正在修改补丁。如果我们这样做,我会更新答案。
Gyan

嗯,输出还不是很正确。首先,它是旋转的。我修好了-metadata:s:v rotate="-90"。其次,帧速率仅为25fps,而原始帧速率为30fps。这意味着视频流中的帧太多,导致视频随着时间的推移而落后于音频。我-r 30在不同的地方尝试了两个步骤,但似乎没有用。
LWChris

听起来你有一个旧版本的ffmpeg; 较新的版本应该读取broken.h264帧率。无论如何,您可以在第二个命令-r 30之前添加-i broken.h264
Gyan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.