ijkplayer開啟rtsp與MJPEG的支持

 * author:conowen@大鐘                                                                                                                          
 * E-mail:conowen@hotmail.com      

1、編譯ijkplayer

由于iOS原生不支持rtsp協議的視頻流播放赏半,所以只能使用FFmpeg贺归,但是直接使用原生FFmpeg,還要對它進行二次封裝断箫,這個工作量太大拂酣,所以使用了現在github 上最熱門的FFmpeg封裝庫ijkplayer,這個庫是bilibili出品仲义,現在主流的直播APP和視頻播放器大部分都是基于ijkplayer開發(fā)的婶熬,功能十分強大,并且同時支持iOS與Android埃撵,地址為

https://github.com/Bilibili/ijkplayer.git

以下是iOS版本的編譯步驟

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
cd ijkplayer-ios
git checkout -B latest k0.7.6

./init-ios.sh

cd ios
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

編譯完成后赵颅,打開iOS目錄下的IJKMediaPlayer工程,選擇“building setting”的編譯選項“?Build Active Architecture Only”的Release 和Debug都為NO暂刘,要不然最后導入編譯出來的Framework打包不了饺谬。


1.png

編譯出Framework之后,就要導入到Focus項目中谣拣,導入ijkplayer還要引入以下Framework募寨,如下圖所示

2.png

2、使用ijkplayer

構建工程森缠,使用IJKMediaFramework對rtsp視頻流播放的時候绪商,通過Xcode的console窗口看到了一個錯誤信息

rtsp://192.168.0.1:8554/MJPEG_unicast: Protocol not found

這是由于FFmpeg的config文件沒有開啟對rtsp協議的支持,來到ijkplayer/config目錄下辅鲸,找到module-lite.sh文件格郁,該文件是編譯FFmpeg的配置文件,配置打開那個模塊独悴,關閉那些模塊例书。
打開該文件,找到
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=rtp"
修改為以下刻炒,就可以打開rtsp協議了决采。
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp"
然后繼續(xù)添加以下一行,打開rtsp音視頻分離器
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp""
然后執(zhí)行以下命令坟奥,連接配置文件

cd config
rm module.sh
ln -s module-lite.sh module.sh
cd ios
sh compole-ffmpeg clean
sh compile-ffmpeg all

重新編譯后树瞭,發(fā)現rstp協議已經支持拇厢,但是還是播放不了,通過Xcode的console窗口看到了一個錯誤信息
No codec could be found with id 8
缺少ID為8的codec晒喷,我們找到FFmpeg里面的avcodec.h頭文件孝偎,找到以下定義

enum AVCodecID {
    AV_CODEC_ID_NONE,

    /* video codecs */
    AV_CODEC_ID_MPEG1VIDEO,
    AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
#if FF_API_XVMC
    AV_CODEC_ID_MPEG2VIDEO_XVMC,
#endif /* FF_API_XVMC */
    AV_CODEC_ID_H261,
    AV_CODEC_ID_H263,
    AV_CODEC_ID_RV10,
    AV_CODEC_ID_RV20,
    AV_CODEC_ID_MJPEG,
    AV_CODEC_ID_MJPEGB,
    AV_CODEC_ID_LJPEG,
。凉敲。衣盾。。爷抓。势决。。

ID為8的codec正是MJPEG解碼器蓝撇,重新打開module-lite.sh文件果复,添加以下兩行

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mjpeg"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mjpeg"

繼續(xù)重新編譯,然后重新打包Framework渤昌,就可以正常播放了据悔。但是實際播放效果非常不理想,卡頓非常嚴重耘沼,延遲至少1000ms<恰!H亨汀菠隆!1

3、優(yōu)化ijkplayer

新建player的時候狂秘,并沒有配置player骇径,添加以下配置代碼,就可以達到較佳的播放效果了者春。
代碼如下

IJKFFOptions *options = [IJKFFOptions optionsByDefault];

    [options setPlayerOptionIntValue:30  forKey:@"max-fps"];
    [options setPlayerOptionIntValue:1  forKey:@"framedrop"];
    [options setPlayerOptionIntValue:0  forKey:@"start-on-prepared"];
    [options setPlayerOptionIntValue:0  forKey:@"http-detect-range-support"];
    [options setPlayerOptionIntValue:48  forKey:@"skip_loop_filter"];
    [options setPlayerOptionIntValue:0  forKey:@"packet-buffering"];
    [options setPlayerOptionIntValue:2000000 forKey:@"analyzeduration"];
    [options setPlayerOptionIntValue:25  forKey:@"min-frames"];
    [options setPlayerOptionIntValue:1  forKey:@"start-on-prepared"];
    
    [options setCodecOptionIntValue:8 forKey:@"skip_frame"];
    
    [options setFormatOptionValue:@"nobuffer" forKey:@"fflags"];
    [options setFormatOptionValue:@"8192" forKey:@"probsize"];
    [options setFormatOptionIntValue:0 forKey:@"auto_convert"];
    [options setFormatOptionIntValue:1 forKey:@"reconnect"];
    
    [options setPlayerOptionIntValue:1  forKey:@"videotoolbox"];
    
    // 幀速率(fps) (可以改破衔,確認非標準楨率會導致音畫不同步,所以只能設定為15或者29.97)
    [options setPlayerOptionIntValue:29.97 forKey:@"r"];
    // -vol——設置音量大小钱烟,256為標準音量晰筛。(要設置成兩倍音量時則輸入512,依此類推
    [options setPlayerOptionIntValue:512 forKey:@"vol"];
    
    _player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:options];

4拴袭、對FFmpeg瘦身

優(yōu)化完ijkplayer之后读第,發(fā)現了編譯出來的Framework接近100M!拥刻,由于Camera的視頻流編碼格式為MJPEG怜瞒,而且只使用rtsp,并且沒有音頻般哼,那我們可以關閉沒有用到的編碼器和協議吴汪,還有惠窄,我們直接關閉音頻的支持,最后優(yōu)化過的module-lite.sh文件如下漾橙,編譯出來的Framework只有23M杆融,簡直完美。

#! /usr/bin/env bash

#--------------------
# Standard options:
export COMMON_FF_CFG_FLAGS=
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --prefix=PREFIX"

# Licensing options:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gpl"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-version3"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-nonfree"

# Configuration options:
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-static"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-shared"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-small"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-runtime-cpudetect"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gray"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-swscale-alpha"

# Program options:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-programs"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffmpeg"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffplay"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffprobe"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver"

# Documentation options:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-doc"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-htmlpages"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-manpages"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-podpages"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-txtpages"

# Component options:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avdevice"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avcodec"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avformat"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avutil"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swresample"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swscale"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-postproc"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avfilter"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avresample"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-pthreads"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-w32threads"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-os2threads"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-network"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dct"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dwt"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lsp"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lzo"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mdct"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-rdft"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fft"

# Hardware accelerators:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-d3d11va"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dxva2"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vaapi"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vda"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vdpau"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-videotoolbox"

# Individual component options:
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-everything"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-encoders"

# ./configure --list-decoders
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-decoders"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mjpeg"

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-hwaccels"

# ./configure --list-muxers
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-muxers"


# ./configure --list-demuxers
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-demuxers"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mjpeg"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"

# ./configure --list-parsers 字幕
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-parsers"



# ./configure --list-bsf 比特流濾鏡(過濾器)
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsfs"

# ./configure --list-protocols
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocols"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=async"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp"


#
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-devices"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-filters"

# External library support:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-iconv"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-audiotoolbox"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-videotoolbox"
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末近刘,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子臀晃,更是在濱河造成了極大的恐慌觉渴,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徽惋,死亡現場離奇詭異案淋,居然都是意外死亡,警方通過查閱死者的電腦和手機险绘,發(fā)現死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門踢京,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宦棺,你說我怎么就攤上這事瓣距。” “怎么了代咸?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵蹈丸,是天一觀的道長。 經常有香客問我呐芥,道長逻杖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任思瘟,我火速辦了婚禮荸百,結果婚禮上,老公的妹妹穿的比我還像新娘滨攻。我一直安慰自己够话,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布光绕。 她就那樣靜靜地躺著更鲁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奇钞。 梳的紋絲不亂的頭發(fā)上澡为,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音景埃,去河邊找鬼媒至。 笑死顶别,一個胖子當著我的面吹牛,可吹牛的內容都是我干的拒啰。 我是一名探鬼主播驯绎,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谋旦!你這毒婦竟也來了剩失?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤册着,失蹤者是張志新(化名)和其女友劉穎拴孤,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體甲捏,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡演熟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了司顿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芒粹。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖大溜,靈堂內的尸體忽然破棺而出化漆,到底是詐尸還是另有隱情,我是刑警寧澤钦奋,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布获三,位于F島的核電站,受9級特大地震影響锨苏,放射性物質發(fā)生泄漏疙教。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一伞租、第九天 我趴在偏房一處隱蔽的房頂上張望贞谓。 院中可真熱鬧,春花似錦葵诈、人聲如沸裸弦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽理疙。三九已至,卻和暖如春泞坦,著一層夾襖步出監(jiān)牢的瞬間窖贤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赃梧,地道東北人滤蝠。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像授嘀,于是被迫代替她去往敵國和親物咳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容

  • 今天記錄一下 ijk 蹄皱,ijk 默認不支持播放 RTSP 的览闰,下面就說一下如何配置 ijk 讓其支持播放 RTSP...
    今天_現在閱讀 4,449評論 2 7
  • 前言 隨著音視頻領域的火熱,在很多領域(教育巷折,游戲压鉴,娛樂,體育盔几,跑步晴弃,餐飲掩幢,音樂等)嘗試做音視頻直播/點播功能逊拍,那...
    passiontim閱讀 3,267評論 1 46
  • 公司要做點播平臺,故而研究了幾個播放器:百度际邻,Vitamio芯丧,ijkplayer。綜合這三個播放器的特點世曾,既能...
    yxy舊時光閱讀 17,312評論 80 48
  • 1.下載WMware虛擬機并安裝激活 2.下載ubuntu系統(tǒng)并在WMware中新建虛擬機安裝該系統(tǒng)缨恒,開機在HOM...
    兣甅閱讀 874評論 0 0
  • 時好時壞的事情更容易讓人上癮。 在剛開始跑步時好像就有這種現象存在轮听,大二的時候每天跑3公里骗露,覺得這樣應該可以減肥。...
    百日跑者孫大剩閱讀 326評論 10 6