ffmpeg C APIを使用して、ライブレンダリングされたビデオをmpgおよび/またはmp4(ビデオのその後の使用法によって異なります)にエンコードしています。mp4にエンコードする場合、すべてが順調です。ただし、mpgにエンコードする場合、結果のビデオはどのプレーヤーでも再生できません。その上でffprobeをすばやく呼び出すと、ヘッダーが欠落していることがわかります。しかし、私が明示的に書いているので、これはほとんど不可能に思えます。
これは、フレームがエンコードされる前に、ヘッダーを書き込む方法です。
// ptr->oc is the AVFormatContext
int error = avformat_write_header(ptr->oc, NULL);
if (error < 0)
{
s_logFile << "Could not write header. Error: " << error << endl;
fprintf(stderr, "Could not write header. Error: '%i'\n", error);
return 1;
}
ヘッダーの書き込み時にエラーが発生することはありません。
エンコードについては、公式のmuxing.cの例に従っているため、CODEC_FLAG_GLOBAL_HEADERフラグを設定します。CODEC_ID_MPEG2VIDEO(ビデオ用)とCODEC_ID_MP2(オーディオ用)を使用しています。
結果のmpgは、 「ffmpeg -i ownEncoded.mpg -sameq-yworking.mpg」のような外部ffmpeg実行可能ファイルを使用して追加の手順で「エンコード」すると機能します。したがって、すべてのデータがそこにあるように見えますが、何らかの理由でヘッダーのみが欠落しています...
ffmpegがヘッダーを書き込む前/書き込み時に報告するのは次のとおりです。
mpeg -------------------
lvl: 24
msg: VBV buffer size not set, muxing may fail
それが問題でしょうか?
mp4にエンコードするときにqmin、qmax、me_methodなどの特別な値を設定することを除いて、まったく同じ関数でmp4をエンコードするので、ここで何が間違っているのでしょうか。ffmpegが実際にヘッダーを正しく書き込むように、おそらく特別な値を設定する必要がありますか?