0

要するに、少量のビデオ フレームをエンコードし、そのストリームを再エンコードせずに、はるかに大きな 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 構造体でできる限りすべてを一致させます。

これでエンコードを行うことができ、エンコードされたビデオは結合ポイントまで正しく再生されます。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 に答える