2013-03-26 26 views
3

我正试图创建一个小演示,以获得用ffmpeg编程流式传输的感觉。我使用this question的代码作为基础。我可以编译我的代码,但是当我尝试运行它,我总是得到这个错误:FFMPEG流RTP:时基未设置

[rtp @ 0xbeb480] time base not set

的事情是,我已经设置了时间基准参数。我甚至尝试将它们设置为流(以及与流相关的编解码器),尽管根据我的理解,这应该不是必需的。这是我的代码中的相关部分:

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源代码挖掘没有产生任何有用的结果。我认为这是非常基本的,但我被卡住了。谁能帮我?

回答

3

您正在设置。

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的方法可能也会起作用。

+0

非常感谢:) – Managarm 2014-08-24 22:11:01

0

尝试:在一个错误的编解码器的情况下

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

对不起,这没有帮助。 – Managarm 2013-09-09 19:36:21