0

简而言之:我必须编码少量视频帧并将它们拼接到更大的 h.264 流前面,而无需重新编码所述流。

详细信息:我收到一个多 GB 传输流,其中包含一个 h.264 es 和一个音频 es。目前 h.264 流总是使用 x264 生成的,我可以假设将来会是这种情况。现在我必须在这个流中添加一些视频帧,但不允许解码/编码整个流;这让我有唯一的选择来找出我需要传递 x264_encoder_open 的确切参数,以便两个流匹配。

目前我正在做的是:

  1. 解复用原始 ts 并提取 h.264 NAL 数据包。
  2. 当我找到第一个“未注册用户数据”的 SEI 数据包时,我对其进行解析并找到一堆 x264 参数。
  3. 使用 libavcodec 开始解码视频。这给了我图片的尺寸以及 AVCodecContext 结构中的 h264 配置文件和级别。
  4. 在 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.

这清楚地表明我的编码帧与原始帧不匹配。我一直在浏览源代码,似乎找不到这样做的方法。我目前拥有的(除了不工作)涉及很多猜测,所以即使我可以使用我拥有的少数示例文件使其工作,我也会害怕在生产服务器中部署它。

所以显而易见的问题是:有没有一种安全、正式的方式来做到这一点?

提前致谢

4

1 回答 1

0

最后我自己解决了。原来你只需要匹配图像大小和纵横比,所以它可以很简单:

x264_param_t xparam ;
x264_param_default( &xparam );

xparam.i_width          = width  ;
xparam.i_height         = height ;
xparam.vui.i_sar_height = 1      ;
xparam.vui.i_sar_width  = 1      ;

x264_t * x264 = x264_encoder_open( &xparam );
于 2013-06-06T16:58:34.377 回答