【Qt+FFmpeg】FFmpeg解码固定摄像头分辨率——推流 av_dict_set 参数设置

你是否出现过ffmpeg编解码摄像头在自己电脑上是正常的,但是在别的机子上却不能编码成功,或者即使成功,也只画面显示了一部分,和自己电脑上测试的不一样;

根据我的测试,这应该是摄像头分辨率不匹配造成的,比如说你电脑的摄像头分辨率是1080*720,在比你分辨率高的摄像头如1920*1080上运行时,画面像是被放大,只显示了一角;如果你在比你摄像头分辨率低的电脑上运行,如640*480,编码完就不能正常生成h264文件;

解决方法:

我们需要用到AVDictionary字典,并运用av_dict_set进行设置摄像头分辨率,每次打开只调用640*480档位的;

AVDictionary* options = nullptr;
av_dict_set(&options,"video_size","640*480",0);
int avformat_open_result = avformat_open_input(&avformat_context,filename.toStdString().c_str(),fmt,&options);

然后我们讲一讲什么是AVDictionary;

FFmpeg中的AVDictionary是一个结构体,简单的key/value存储 ;

av_dict_set()可以用来创建AVDictionary,通过给方法传入NULL指针,其内部会创建新的AVDictionary,并通过这个指针返回给用户新创建的AVDictionary对象;注意上面源码的示例,在key和value都已经分配好空间的时候,使用av_dict_set()时需要设置flags以便使得函数内部不再为key和value另分配空间了,直接利用外部已经分配好的

av_dict_set其他的一些参数设置:

一、关于影响时延的参数设置

1.preset :指定编码的配置

例:av_dict_set(¶m, "preset", "ultrafast", 0);

2.muxdelay || max_delay:设置延迟约束,muxdelay以秒为单位设置延迟,而max_delay以微秒为单位设置延迟。最终结果是相同的。
例:av_dict_set(¶m, "muxdelay", "1", 0);

3.zerolatency:转码延迟,以牺牲视频质量减少时延
例:av_dict_set(¶m, "tune", "zerolatency", 0);

 

二、关于影响视频质量的参数设置

1.crf:用于指定输出视频的质量,取值范围是0-51,默认值为23,数字越小输出视频的质量越高。

例:av_dict_set(¶m, "crf", "18", 0);

2.level:越高视频质量也就越高
例:av_dict_set(¶m, "level", "4",0);

【Qt+FFmpeg】FFmpeg解码固定摄像头分辨率——推流 av_dict_set 参数设置_第1张图片 

三、其它

1.buffer_size:减少卡顿或者花屏现象,相当于增加或扩大了缓冲区,给予编码和发送足够的时间
例:av_dict_set(¶m, "buffer_size", "1024000", 0);

2.rtsp_transport:修改优先连接发送方式,可以用udp、tcp、rtp
例:av_dict_set(¶m, "rtsp_transport", "udp", 0);

3.stimeout:设置超时断开,在进行连接时是阻塞状态,若没有设置超时断开则会一直去阻塞获取数据,单位是微秒。
例:av_dict_set(¶m, "stimeout", "5000000", 0);

4.movflags :加入mp4头。
例:av_dict_set(¶m, "movflags", "empty_moov+default_base_moof+faststart", 0);

5.frag_duration:设定mp4容器大小
例:av_dict_set_int(¶m,''frag_duration", 100 * 1000, 0);

av_dict_set其他设置详情参考

ffmpeg推流 av_dict_set 参数设置解析(降低延时、处理花屏、改善画面质量)(实时更新)_ZackZheng999的博客-CSDN博客_av_dict_set

 

感谢观看!!!!

以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!

 

你可能感兴趣的:(FFmpeg学习,ffmpeg,qt,音视频)