C++ で FFMPEG API を使用して生の H264 を mp4 コンテナーにエンコードしようとしています。すべて正常に動作しますが、AVCC ボックスが空で、次のエラーが返されます: [iso file] Box "avcC" size 8 invalid
次に、出力ファイルでコマンド ライン ツールを使用すると、次のようになります。
ffmpeg -i output.mp4 -vcodec copy fixed.mp4
出力ファイルが機能し、AVCC に必要な情報が取り込まれます。このコマンド ライン引数が機能する理由がわかりませんが、API を使用して同じ結果を生成することはできません。
C++ コードで行うこと (関数呼び出しの間でも行うこと):
outputFormat_ = av_guess_format( "mp4", NULL, NULL ); //AV_CODEC_H264
formatContext_ = avformat_alloc_context();
formatContext_->oformat = outputFormat_;
...
AVDictionary *opts = NULL;
char tmpstr[50]; sprintf(tmpstr, "%i", muxRate * KILOBYTESTOBYTES);
av_dict_set(&opts, "muxrate", tmpstr, 0);
avformat_write_header( formatContext_, &opts);
av_write_trailer(formatContext_);
これの出力は正しいですが、AVCC 情報が欠落しています。これを手動で追加すると(それに応じてボックスの長さを修正すると)、ビデオを正常に再生できます。API 呼び出しが AVCC 情報を生成しない理由は何ですか?
参考までに、修正前の mp4 の文字は次のとおりです。
.avc1........................€.8.H...H........ ............................ÿÿ....avcC....stts
以降:
avc1.................................................€.8.H...H................. ..........ÿÿ...!avcC.B€(ÿá..gB€(Ú.à.—•. ..hÎ<€....stts