FFMPEG 流 RTP:未设置时基

Man*_*arm 6 streaming ffmpeg rtp h.264

我正在尝试创建一个小演示,以了解使用 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);
Run Code Online (Sandbox Code Playgroud)

在接近末尾调用“avformat_write_header”时发生错误。检查所有可能失败的方法(如 avcodec_open2),我只是删除了检查以使代码更具可读性。

挖掘谷歌和 ffmpeg 源代码没有产生任何有用的结果。我认为这真的很基本,但我被卡住了。谁能帮我?

小智 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;
Run Code Online (Sandbox Code Playgroud)

这为我解决了这个特定问题,我也添加了此处给出的其他答案,因为这就是我设置它的方式,尽管time_base如果您一直在与正确的编解码器上下文交谈,您的设置方法可能也可以工作。