编码h264以匹配现有流

时间:2013-06-03 13:23:49

标签: video h.264 x264 libx264

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

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

目前我正在做的是:

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

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

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

    先谢谢

1 个答案:

答案 0 :(得分: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 );