如何有效设置mp4影片第一帧的时长?

如何有效设置mp4影片第一帧的时长?

我有一个自编码的应用程序,利用Google 在 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 文件,但大多数工具都没有改变任何东西或没有发现任何需要修复的问题,而且根本无法运行。

经过反复尝试,我发现第一个可行的解决方案。我使用了setpts带有过滤选项的 ffmpeg:。.\ffmpeg.exe -i "broken.mp4" -vf setpts=N/FRAME_RATE/TB "fixed.mp4"之后,修复后的文件运行良好(并且也小了很多)。

问题这种方法的缺点是,完成所需的时间与我想要修复的视频长度差不多。但是,将来我想要使用该应用制作的视频可能长达一小时左右。

所以我想知道,是否有可能调整第一帧显示的持续时间?理论上,这意味着 ffmpeg 只需要替换一个整数,而根本不需要处理解码或编码。可以做到吗?如何做到?

答案1

因为根据您的工作解决方案,您似乎可以将输出与恒定帧速率保持一致,所以我建议采用这种更快捷的两步方法。无需重新编码。

提取原始流:

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

重新复用:

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

相关内容