Qt+FFmpegFFmpeg解码固定摄像头分辨率——推流 av_dict_set 参数设置
Posted logani
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt+FFmpegFFmpeg解码固定摄像头分辨率——推流 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);
三、其它
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
感谢观看!!!!
以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!
以上是关于Qt+FFmpegFFmpeg解码固定摄像头分辨率——推流 av_dict_set 参数设置的主要内容,如果未能解决你的问题,请参考以下文章
FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )