ijkplayer對rtsp的支持是很弱的狡汉,所以需要修改一些代碼;
- Config
首先要開啟rtsp的一些config選項,不知道最新的版本是否已經(jīng)添加,不過我用的是0.7.2還沒加上讹开。
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=sdp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtp"
- Code
很多人一拿到編好的庫,發(fā)現(xiàn)播不了捐名,其實是因為下面這句代碼
因為av_read_frame讀到了數(shù)據(jù)旦万,到這里又不處理,導(dǎo)致緩沖區(qū)一直不滿镶蹋,
所以rtsp不要設(shè)置緩沖區(qū);
#if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
if (is->paused &&
(!strcmp(ic->iformat->name, "rtsp") ||
(ic->pb && !strncmp(ffp->input_filename, "mmsh:", 5)))) {
/* wait 10 ms to avoid trying to get another packet */
/* XXX: horrible */
SDL_Delay(10);
continue;
}
#endif
把這段代碼注釋了吧成艘!
另外,不設(shè)置緩沖區(qū),在應(yīng)用層添加(以android為例):
// 最大緩沖cache是3s贺归, 有時候網(wǎng)絡(luò)波動淆两,會突然在短時間內(nèi)收到好幾秒的數(shù)據(jù)
// 因此需要播放器丟包,才不會累積延時
// 這個和第三個參數(shù)packet-buffering無關(guān)牧氮。
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max_cached_duration", 3000);
// 無限制收流
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", 1);
// 設(shè)置無緩沖琼腔,這是播放器的緩沖區(qū)瑰枫,有數(shù)據(jù)就播放
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);
// 可選踱葛,有時候tcp模式出畫面更快丹莲,因為rtsp是先udp,不成功再切到tcp的
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_transport", "tcp");
// 設(shè)置在解析的 url 之前 (這里設(shè)置超時為5秒)
// 如果沒有設(shè)置stimeout尸诽,在解析時(也就是avformat_open_input)把網(wǎng)線拔掉甥材,av_read_frame會阻塞(時間單位是微妙)
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "stimeout", "5000000");
3.講的差不多了,代碼面前性含,了無秘密洲赵,
需要rtsp的優(yōu)化后代碼,請私信我QQ:307509256商蕴。
- 前兩天聽群里人說叠萍,抓包看ijk播放rtsp不會發(fā)TEARDOWN,斷開時通過tcp read的timeout绪商,大概也就30s左右吧苛谷,如果是這樣,那確實是ijk對rtsp支持的一個bug格郁,vlc抓包是有發(fā)的腹殿,我沒去查原因,知情者可以討論下例书;
后記:
如果代碼有bug或好的建議锣尉,請不吝賜教;
如果覺得有用决采,并加顆星自沧;
Ai時代,寫作是一種新競爭力树瞭,自勉之~