ffmpeg使用笔记

记录一下最近对接rtsp摄像头的过程:

1.版本问题
使用2.8.15版本时
pformatContext=avformat_alloc_context();
load_options();
pformatContext->flags |=AVFMT_FLAG_NOBUFFER;
if((ret=avformat_open_input(&pformatContext,url.c_str(),NULL,&optionsDict))<0)

在open_input之前需要初始化,否则会异常,高版本似乎没这个问题;

2.延时降低:

  1. pformatContext->flags |=AVFMT_FLAG_NOBUFFER;

  2. pcodecContext->flags |=CODEC_FLAG_LOW_DELAY;
    使用2时效果明显,从500ms直接降到250ms,这部是解码本地会缓存部分帧,这个设置可以消除缓存帧对延时的影响;

3.画面问题:
void rtsp_camera::load_options()
{
optionsDict = NULL;
av_dict_set(&optionsDict, “rtsp_transport”, “udp”, 0);
av_dict_set(&optionsDict, “buffer_size”, “1024000”, 0);
av_dict_set(&optionsDict, “max_delay”, “500000”, 0);
av_dict_set(&optionsDict, “fflags”, “nobuffer”, 0);
av_dict_set(&optionsDict, “probsize”, “4096”, 0);
av_dict_set(&optionsDict, “packet-buffering”, “0”, 0);
av_dict_set(&optionsDict, “fps”, “30”, 0);
}

由udp改为tcp传输画面会变好,可能因为我是网线直接连接,udp和tcp传输延时接近,没什么区别;

4.编码延时减小的参数:
AVDictionary *param = 0;
av_dict_set(&param, “preset”, “fast”, 0);
av_dict_set(&param, “tune”, “zerolatency”, 0);

–preset的参数主要调节编码速度和质量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢。

–tune的参数主要配合视频类型和视觉优化的参数,或特别的情况。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)。

tune的值有: film: 电影、真人类型;

animation: 动画;

grain: 需要保留大量的grain时用;

stillimage: 静态图像编码时使用;

psnr: 为提高psnr做了优化的参数;

ssim: 为提高ssim做了优化的参数;

fastdecode: 可以快速解码的参数;
zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章