我试图捕获相机输出并使用libavcodec制作视频.作为如何实现这一点的一个例子,我使用了
ffmpeg muxing example.
问题是4秒视频的大小约为15mb,比特率为~30000 kb / s,虽然我已经将AVCodecContext的比特率设置为400000(我认为这个值是以比特/秒为单位,而不是kb / s) .
我还试图从命令行使用ffmpeg录制视频,它的比特率为~700 kb / s.
有没有人知道为什么不保留比特率,因此产生的文件非常大?我用来初始化编解码器上下文的代码如下:
初始化部分:
avformat_alloc_output_context2(&m_formatContext, NULL, NULL, filename);
outputFormat = m_formatContext->oformat;
codec = avcodec_find_encoder(outputFormat->video_codec);
m_videoStream = avformat_new_stream(m_formatContext, codec);
m_videoStream->id = m_formatContext->nb_streams - 1;
codecContext = m_videoStream->codec;
codecContext->codec_id = outputFormat->video_codec;
codecContext->width = m_videoResolution.width();
codecContext->height = m_videoResolution.height();
int m_bitRate = 400000;
codecContext->bit_rate = m_bitRate;
codecContext->rc_min_rate = m_bitRate;
codecContext->rc_max_rate = m_bitRate;
codecContext->bit_rate_tolerance = 0;
codecContext->time_base.den = 20;
codecContext->time_base.num = 1;
codecContext->pix_fmt = AV_PIX_FMT_YUV422P;
if (m_formatContext->oformat->flags & AVFMT_GLOBALHEADER)
codecContext->flags |= CODEC_FLAG_GLOBAL_HEADER;
/* open it */
ret = avcodec_open2(codecContext, codec, NULL);
avFrame = avcodec_alloc_frame();
ret = avpicture_alloc(&avPicture, codecContext->pix_fmt, codecContext->width, codecContext->height);
*((AVPicture *)avFrame) = avPicture;
av_dump_format(m_formatContext, 0, filename, 1);
if (!(outputFormat->flags & AVFMT_NOFILE)) {
ret = avio_open(&m_formatContext->pb, filename, AVIO_FLAG_WRITE);
}
ret = avformat_write_header(m_formatContext, NULL);
if (avFrame)
avFrame->pts = 0;
最佳答案 因为每个编码器都有自己的配置文件,您提供的比特率是一个提示.如果你的比特率是一个有效值(不是太小而不是太大),编解码器只会在他的个人资料列表中选择一个支持的比特率.
编解码“能力”也可能影响比特率,但据我所知.
编解码器配置文件至少定义了相关性:
>框架尺寸(宽度,高度)
>比特率
>像素格式
>帧率
我仍然很难找到一种方法来使用api从编解码器中获取比特率,但是你可以通过在打开编解码器之前给出一个非常低的比特率来找出它的配置文件.
与代码
codecContext->bit_rate = 1;
avcodec_open2(codecContext, codec, NULL);
FFmpeg编解码器将记录投诉和上面列出的可接受元组列表.
注意:仅尝试使用不需要外部库的编解码器