简而言之:我必须编码少量视频帧并将它们拼接到更大的 h.264 流前面,而无需重新编码所述流。
详细信息:我收到一个多 GB 传输流,其中包含一个 h.264 es 和一个音频 es。目前 h.264 流总是使用 x264 生成的,我可以假设将来会是这种情况。现在我必须在这个流中添加一些视频帧,但不允许解码/编码整个流;这让我有唯一的选择来找出我需要传递 x264_encoder_open 的确切参数,以便两个流匹配。
目前我正在做的是:
- 解复用原始 ts 并提取 h.264 NAL 数据包。
- 当我找到第一个“未注册用户数据”的 SEI 数据包时,我对其进行解析并找到一堆 x264 参数。
- 使用 libavcodec 开始解码视频。这给了我图片的尺寸以及 AVCodecContext 结构中的 h264 配置文件和级别。
- 在 x264_param_t 结构中尽可能匹配所有这些。
我可以用它进行一些编码,并且编码的视频可以正确播放到连接点。当 VLC 到达缝合点时,它开始抛出以下消息序列,并在停止播放后不久:
[h264 @ 0x7fe36cd75be0] decode_slice_header error
[h264 @ 0x7fe36cd75be0] no frame!
[h264 @ 0x7fe36ccc9080] Width/height changing with threads is not implemented. Update your Libav version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
这清楚地表明我的编码帧与原始帧不匹配。我一直在浏览源代码,似乎找不到这样做的方法。我目前拥有的(除了不工作)涉及很多猜测,所以即使我可以使用我拥有的少数示例文件使其工作,我也会害怕在生产服务器中部署它。
所以显而易见的问题是:有没有一种安全、正式的方式来做到这一点?
提前致谢