簡(jiǎn)單說(shuō)明一下: 我是使用FFMPeg的SDK 自己敲的代碼將RTSP流轉(zhuǎn)RTMP流推到Nginx-rtmp上的
然后用VLC測(cè)試畫面正常,但是前端同學(xué)拿過(guò)去用的時(shí)候就是左圖的樣子, 最后百度了好幾天,期間也沒(méi)什么人會(huì)幫助你,最后原因就是編碼器的問(wèn)題
原先的編碼器參數(shù):?
//a 找到編碼器
? ? AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
? ? if (!codec) return 1;
? ? //b 創(chuàng)建編碼器上下文
? ? vc = avcodec_alloc_context3(codec);
? ? if (!vc) return 1;
? ? //c 配置編碼器參數(shù)
//? ? vc->codec_type = AVMEDIA_TYPE_VIDEO;
? ? vc->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; //全局參數(shù)
? ? vc->codec_id = codec->id;
? ? vc->codec_type = AVMEDIA_TYPE_VIDEO;
? ? vc->thread_count = 8;
? ? vc->bit_rate = 50 * 1024 * 8;//壓縮后每秒視頻的bit位大小 50kB
? ? vc->width = inWidth;
? ? vc->height = inHeight;
? ? vc->time_base = { 1,fps };
? ? vc->framerate = { fps,1 };
? ? //畫面組的大小竭讳,多少幀一個(gè)關(guān)鍵幀
? ? vc->gop_size = 50;
? ? vc->max_b_frames = 0;
? ? vc->pix_fmt = AV_PIX_FMT_YUV420P;
修改后的編碼器參數(shù):
//a 找到編碼器
? ? AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
? ? if (!codec) return 1;
? ? //b 創(chuàng)建編碼器上下文
? ? vc = avcodec_alloc_context3(codec);
? ? if (!vc) return 1;
? ? //c 配置編碼器參數(shù)
//? ? vc->codec_type = AVMEDIA_TYPE_VIDEO;
? ? vc->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; //全局參數(shù)
? ? vc->codec_id = codec->id;
? ? vc->codec_type = AVMEDIA_TYPE_VIDEO;
? ? vc->thread_count = 8;
? ? vc->bit_rate = 50 * 1024 * 8;//壓縮后每秒視頻的bit位大小 50kB
? ? vc->width = inWidth;
? ? vc->height = inHeight;
? ? vc->time_base = { 1,fps };
? ? vc->framerate = { fps,1 };
? ? //畫面組的大小垦细,多少幀一個(gè)關(guān)鍵幀
? ? vc->gop_size = 50;
? ? vc->max_b_frames = 0;
? ? vc->pix_fmt = AV_PIX_FMT_YUV420P;
? ? if (codec->id == AV_CODEC_ID_H264)
? ? {
? ? ? ? av_opt_set(vc->priv_data, "preset", "ultrafast", 0); //ultrafast
? ? }
? ? av_opt_set(vc->priv_data, "tune", "zerolatency", 0);
分析:
可以看到就是加了下面兩句
?if (codec->id == AV_CODEC_ID_H264)
? ? {
? ? ? ? av_opt_set(vc->priv_data, "preset", "ultrafast", 0); //ultrafast
? ? }
? ? av_opt_set(vc->priv_data, "tune", "zerolatency", 0);
然后就有畫面了, 這兩行代碼是解決延遲的問(wèn)題.?