6

ffmpegを使ってプログラムでストリーミングする感覚を得るために、小さなデモを作成しようとしています。私はこの質問のコードを基礎として使用しています。コードをコンパイルすることはできますが、実行しようとすると、常に次のエラーが発生します。

[rtp@0xbeb480]タイムベースが設定されていません

問題は、タイムベースパラメータを設定したことです。ストリーム(およびストリームに関連付けられたコーデック)にもそれらを設定しようとしましたが、私が理解している限り、これは必要ではないはずです。これは私のコードの関連セクションです:

AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);
AVCodecContext* c = avcodec_alloc_context3(codec);
c->pix_fmt = AV_PIX_FMT_YUV420P;
c->flags = CODEC_FLAG_GLOBAL_HEADER;
c->width = WIDTH;
c->height = HEIGHT;
c->time_base.den = FPS;
c->time_base.num = 1;
c->gop_size = FPS;
c->bit_rate = BITRATE;

avcodec_open2(c, codec, NULL);
struct AVStream* stream = avformat_new_stream(avctx, codec);

// TODO: causes an error
avformat_write_header(avctx, NULL);

最後の方で「avformat_write_header」を呼び出すとエラーが発生します。失敗する可能性のあるすべてのメソッド(avcodec_open2など)がチェックされます。コードを読みやすくするために、チェックを削除しました。

グーグルとffmpegのソースコードを掘り下げても、有用な結果は得られませんでした。本当に基本的なことだと思いますが、行き詰まっています。誰が私を助けられるか?

4

2 に答える 2

6

間違ったコーデックコンテキストで設定を行っています。

によって作成されたストリームにavformat_new_stream()は、独自の内部コーデックコンテキストがあります。作成したストリームavcodec_alloc_context3()は不要であり、の動作には影響しませんavformat_write_header()

変数を正しく設定するには、次のように設定します。

AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);
struct AVStream* stream = avformat_new_stream(avctx, codec);
stream->codec->pix_fmt = AV_PIX_FMT_YUV420P;
stream->codec->flags = CODEC_FLAG_GLOBAL_HEADER;
stream->codec->width = WIDTH;
stream->codec->height = HEIGHT;
stream->codec->time_base = (AVRational){1,FPS};
stream->codec->gop_size = FPS;
stream->codec->bit_rate = BITRATE;

time_baseこれでこの特定の問題が解決しました。正しいコーデックコンテキストと話していれば、設定方法も機能する可能性がありますが、ここで示した他の回答も追加しました。

于 2013-09-10T21:21:41.587 に答える
0

試す:

c->time_base = (AVRational) {1, FPS};
于 2013-05-20T09:27:43.083 に答える