我正在开发一个应用程序,该应用程序需要使用 FFmpeg C++ API 克隆一个包含所有流的 MP4 视频文件,并基于FFmpeg remuxing example成功地使其工作。
这对视频和音频流非常有用,但是当视频包含数据流(实际上是根据 MediaInfo 的 QuickTime 时间码)时,我会收到此错误。
Output #0, mp4, to 'C:\Users\user\Desktop\shortOut.mp4':
Stream #0:0: Video: hevc (Main 10) (hev1 / 0x31766568), yuv420p10le(tv,progressive), 3840x2160 [SAR 1:1 DAR 16:9], q=2-31, 1208 kb/s
Stream #0:1: Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 32s
Stream #0:2: Data: none (tmcd / 0x64636D74), 0 kb/s
[mp4 @ 0000000071edf600] Could not find tag for codec none in stream #2, codec not currently supported in container
我发现这发生在对avformat_write_header()
.
有意义的是,如果 FFmpeg 不知道编解码器,则无法将其写入标头,但我发现使用 ffmpeg 命令行我可以使用流的复制命令使其完美工作,例如:
ffmpeg -i input.mp4 -c:v copy -c:a copy -c:a copy output.mp4
我一直在分析 ffmpeg.c 的实现,试图了解它们是如何进行流复制的,但是沿着巨大的管道走下去是非常痛苦的。
使用 FFmpeg C++ API 重新混合这种类型的数据流的正确方法是什么?任何提示或指针?