2

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が実際にヘッダーを正しく書き込むように、おそらく特別な値を設定する必要がありますか?

4

2 に答える 2

2

たぶんあなたはのフラグを設定する必要がありCODEC_FLAG_GLOBAL_HEADERますAVCodecContextoutputFormat->oformat->flags & AVFMT_GLOBALHEADER == true場合に必要outputFormatです。AVOutputFormat

したがって、あなたは書くべきです

if(outputFormat->oformat->flags & AVFMT_GLOBALHEADER) 
  codec->flags |= CODEC_FLAG_GLOBAL_HEADER;

ffmpegの出力も確認する必要があります。警告があるかもしれません。

于 2012-11-23T08:05:13.473 に答える
1

ああ、私の!

CODEC_ID_MPEG2VIDEOが正しく設定されず、代わりにH264をデフォルトとして使用するというタイプミスがあったことがわかりました。もちろん、それは.mpg内ではそれほどうまく機能しません。

コメントのヒントをありがとう、それは私にそれをもう一度見させました!:)

于 2012-11-23T09:30:52.950 に答える