qt+gxdi+ffmpeg远程控制(七)

qt+gxdi+ffmpeg远程控制(六)

本篇主要介绍ffmpeg软编码性能优化问题。

这里给出之前参数设置

    this->m_encode_pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
	this->m_encode_pCodecCtx->bit_rate = 25000 * 1000;
	this->m_encode_pCodecCtx->width = width;
	this->m_encode_pCodecCtx->height = height;
	this->m_encode_pCodecCtx->time_base.num = 1;
	this->m_encode_pCodecCtx->time_base.den = fps;
	this->m_encode_pCodecCtx->framerate.num = fps;
	this->m_encode_pCodecCtx->framerate.den = 1;
	this->m_encode_pCodecCtx->gop_size = 10;
    av_dict_set(&output_param, "preset", "veryfast", 0);
	av_dict_set(&output_param, "tune", "zerolatency", 0);
	av_dict_set(&output_param, "profile", "Main", 0);

obs的h264编码是直接通过x264.h头文件创建的,并不是根据ffmpeg创建。硬编码部分还没太看懂,h264编码的参数如下:

[x264 encoder: 'advanced_video_recording'] settings:
    rate_control: CBR
    bitrate:      2500
    buffer size:  2500
    crf:          23
    fps_num:      60
    fps_den:      1
    width:        2560
    height:       1440
    keyint:       250

当前参数设置

    this->m_encode_pCodecCtx = avcodec_alloc_context3(m_encode_pCodec);
	this->m_encode_pCodecCtx->codec_id = AV_CODEC_ID_H264;
	this->m_encode_pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
	this->m_encode_pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
	this->m_encode_pCodecCtx->bit_rate = bit_rate * 1000;
	this->m_encode_pCodecCtx->rc_min_rate = bit_rate * 1000;
	this->m_encode_pCodecCtx->rc_max_rate = bit_rate * 1000;
	this->m_encode_pCodecCtx->rc_buffer_size = this->m_encode_pCodecCtx->rc_max_rate / 2;
	this->m_encode_pCodecCtx->width = width;
	this->m_encode_pCodecCtx->height = height;
	this->m_encode_pCodecCtx->time_base.num = 1;
	this->m_encode_pCodecCtx->time_base.den = fps;
	this->m_encode_pCodecCtx->framerate.num = fps;
	this->m_encode_pCodecCtx->framerate.den = 1;
	this->m_encode_pCodecCtx->gop_size = fps * 2;

	AVDictionary* output_param = nullptr;
	av_dict_set(&output_param, "preset", "veryfast", 0);
	av_dict_set(&output_param, "tune", "zerolatency", 0);
	av_dict_set(&output_param, "profile", "Baseline", 0);
	av_dict_set(&output_param, "crf", "23", AV_OPT_SEARCH_CHILDREN);

 上述写法是最大比特率的CRF/2-pass模式,应该与obs的h264相同。

指定 AVCodecContext 的 rc_max_rate 和 rc_buffer_size 即可。bufsize 根据你希望比特率获得多大的可变性而设置,默认为 maxrate 的两倍,如果想限制流的比特率,可以设置为 maxrate 的一半。

配合 CRF 模式使用的时候,如果设置的 crf 值过低,视频码率可能超出 -maxrate 的时候,编码器会自动调整 crf,避免出现较大的码率波动。然而,x264 不会严格控制你指定的最大码率,除非使用 2 pass 模式。
原文链接:https://blog.csdn.net/DONGHONGBAI/article/details/84776431

 在解决性能问题后,可以保证正确录制60帧视频。但目前还是只能写入.h264文件,不能仅将该视频流写入mp4文件,接下来主要解决这个问题。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值