gpt4 book ai didi

ffmpeg - 使用 libavcodec 编码视频时比特率极高

转载 作者:行者123 更新时间:2023-12-01 03:53:38 25 4
gpt4 key购买 nike

我正在 try catch 相机输出并使用 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 编解码器将 记录投诉和可接受的元组列表以上所列。

    注意:仅尝试使用不需要外部库的编解码器

    关于ffmpeg - 使用 libavcodec 编码视频时比特率极高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19449424/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com