2013-06-03 34 views
0

簡而言之:我必須編碼少量的視頻幀,並將它們拼接在更大的h.264流之前,而無需重新編碼所述流。對h264進行編碼以匹配現有流

細節:我收到一個包含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結構中匹配所有這些。

我可以做一些編碼,編碼的視頻播放正確的連接點。當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. 

這清楚地表明,我的編碼幀不匹配原有的。我一直在瀏覽源代碼,似乎無法找到一種方法來做到這一點。我目前的工作(除了不工作)涉及很多猜測,所以即使我可以使它適用於我的一些示例文件,我也很害怕在生產服務器上部署這些文件。

所以一個顯而易見的問題是:是否有一個安全正式的方法呢?

在前提前

回答

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);