要するに、少量のビデオ フレームをエンコードし、そのストリームを再エンコードせずに、はるかに大きな h.264 ストリームの前にそれらをステッチする必要があります。
詳細: h.264 es とオーディオ es を含むマルチ GB トランスポート ストリームを受け取りました。現在、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.
これは、エンコードされたフレームが元のフレームと一致しないことを明確に示しています。ソースコードを閲覧してきましたが、これを行う方法が見つからないようです。私が現在持っているもの (動作していないことに加えて) は、多くの当て推量が含まれているため、たとえ私が持っている少数のサンプル ファイルで動作させることができたとしても、これを運用サーバーに展開するのは怖いでしょう.
ですから、当然の疑問は次のとおりです。これを行うための安全で正式な方法はありますか?
前もって感謝します