您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
安卓端ffmpeg基於jni進行攝像頭推流的c語言代碼優化延遲問題
发布时间:2022-04-09 23:23:34编辑:雪饮阅读()
優化前環境:
pixel4a手機,攝像頭推流,安卓Camera2的api推流,640x480推流
延遲:感覺差不多有5-10秒,或許更長,我預估很不准的。。。
用到的調試代碼語句執行耗時統計:
文件頂部先定義:
clock_t begin, duration;
然後使用在某個語句執行前
begin = clock();
執行一些c代碼xxxx后計算耗時
duration = clock() - begin;
打印日志給安卓的logcat
LOGE("av_image_fill_arrays用时约: %d毫秒",duration*1000 / CLOCKS_PER_SEC);
延遲優化主要有以下幾點:
幀率fps:之前是15幀,我修改成25幀就好多了。
關鍵代碼:
文件頭的定義:
AVPacket enc_pkt;
int fps = 25;
關鍵語句塊中對fps的使用:
enc_pkt.pts = count * (video_st->time_base.den) / ((video_st->time_base.num) * fps);
enc_pkt.dts = enc_pkt.pts;
enc_pkt.duration = (video_st->time_base.den) / ((video_st->time_base.num) * fps);
AVCodecContext優化:
關鍵代碼:
文件頭的定義:
AVCodecContext *pCodecCtx;
關鍵語句塊中的優化:
(1):
//两个非B帧之间允许出现多少个B帧数
//设置0表示不使用B帧,b 帧越多,图片越小(降低延遲)
pCodecCtx->max_b_frames = 0;
//superfast,zerolatency好像挺關鍵
if (pCodecCtx->codec_id == AV_CODEC_ID_H264) {
av_dict_set(¶m, "preset", "superfast", 0); //x264编码速度的选项
av_dict_set(¶m, "tune", "zerolatency", 0);
}
(2):
/* Some formats want stream headers to be separate.
* 中文解釋:有些格式希望流头是分开的
*
* // AV_CODEC_FLAG_GLOBAL_HEADER -- 将全局头文件放在引渡文件中,而不是每个关键帧中。
//AV_CODEC_FLAG_LOW_DELAY --较低延迟
* */
/*
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
pCodecCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
*/
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
pCodecCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER|AV_CODEC_FLAG_LOW_DELAY;
(3):
//引用資料“注意关键帧的间隔,设置太大了会导致接收流的时候延迟严重,设置太小了会导致带宽压力(其实也不会太明显)”,這裏之前我使用的是50,由於在局域網裏面(雖然我是連接我魅族16t共享出來的熱點。。。),所以這裏把幀間隔調小了
pCodecCtx->gop_size = 2;
(4):
//零延遲
av_opt_set(pCodecCtx->priv_data, "tune", "zerolatency", 0);
注意,av_opt_set依賴頭文件#include "libavutil/opt.h"
java端優化:
之前camera2的api上面我使用acquireLatestImage來獲取圖像,然後今天有意閒看到官方文檔推薦使用acquireNextImage更適合與實時圖像處理。
maxImages官方有提到2,我試了,效果好像不明顯,我調整為3
mImageReader = ImageReader.newInstance(640, 480,ImageFormat.YUV_420_888, 3);
優化后:
優化后目前大概只有1-3秒延遲,那麽剩下的延遲問題,或許與我的nginx的rtmp模塊的接收速度有關或者與我的魅族16T熱點及涉及到的幾個設備閒的帶寬性能有關。
我的魅族16T為熱點,pixel4a為推送端,win10上的vlc player為拉流端,win10(同一物理機)上的centos7虛擬機中的nginx的rtmp服務為rtmp服務端點。
关键字词:ffmpeg,推流,延遲,c,jni,攝像頭
上一篇:安卓camera2使用ffmpeg進行對rtmp服務器推流的實現
下一篇:CMake Error錯誤(add_library)Cannot find source file在android studio中的解決