【问题标题】:FFMPEG streaming RTP: time base not setFFMPEG 流式传输 RTP:未设置时基
【发布时间】:2013-03-16 15:04:13
【问题描述】:

我正在尝试创建一个小型演示,以感受使用 ffmpeg 以编程方式进行流式传输。我使用来自this question 的代码作为基础。我可以编译我的代码,但是当我尝试运行它时,我总是得到这个错误:

[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),我只是删除了检查以使代码更具可读性。

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

【问题讨论】:

    标签: ffmpeg streaming h.264 rtp


    【解决方案1】:

    试试:

    c->time_base = (AVRational) {1, FPS};
    

    【讨论】:

    • 抱歉,这没有帮助。
    【解决方案2】:

    您在错误的编解码器上下文中进行设置。

    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 的方法可能也有效,如果你一直在交谈正确的编解码器上下文。

    【讨论】:

      猜你喜欢
      • 2017-08-11
      • 2012-07-23
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2021-09-27
      • 2011-10-08
      相关资源
      最近更新 更多