ijkplayer回調(diào)消息處理方案

簡(jiǎn)介:其實(shí)ijkplayer主要控制器就是ff_ffplay.c,基本上沿用了官方ffplay.c

ijkplayer的ff_ffplay.c主要有三大類線程谓娃。

  1. 讀數(shù)據(jù)read_thread蜂莉。
  2. 解碼線程 和 渲染線程。
    (包含在audio_thread和video_thread,既做解碼又做渲染蜈抓。 比如audio_thread:一個(gè)線程做解碼鸯绿,重采樣芹血,通過(guò)回調(diào)數(shù)據(jù)的方式將音頻用sdl渲染輸出)贮泞。

所有的回調(diào)消息,都是在讀數(shù)據(jù)線程:read_thread拋出來(lái)的幔烛。

回調(diào)消息主要有兩類:ERROR 和 COMPLETED啃擦。
對(duì)應(yīng)的代碼定義分別是:FFP_MSG_ERROR 和 FFP_MSG_COMPLETED。

ERROR消息總共有6處饿悬, COMPLETED只有1處令蛉。

先說(shuō)ERROR,前面幾處都是收流(while 循環(huán))前的準(zhǔn)備狡恬。

第一處:這個(gè)是創(chuàng)建對(duì)象互斥鎖珠叔。
一般都不會(huì)失敗,忽略弟劲。

SDL_mutex *wait_mutex = SDL_CreateMutex();

if (!wait_mutex) {
        av_log(NULL, AV_LOG_FATAL, "SDL_CreateMutex(): %s\n", SDL_GetError());
        ret = AVERROR(ENOMEM);
        goto fail;
}

第二處:avformat_alloc_context祷安, 這個(gè)是播放器的全局準(zhǔn)備(調(diào)用av_malloc()為AVFormatContext結(jié)構(gòu)體分配了內(nèi)存,而且同時(shí)也給AVFormatContext中的internal字段分配內(nèi)存)。
一般都不會(huì)失敗兔乞,忽略汇鞭。

ic = avformat_alloc_context();
    if (!ic) {
        av_log(NULL, AV_LOG_FATAL, "Could not allocate context.\n");
        ret = AVERROR(ENOMEM);
        goto fail;
    }

第三處:打開url失敗:一般是url已經(jīng)超時(shí)失效了庸追,或者是有個(gè)錯(cuò)誤的url霍骄。

  err = avformat_open_input(&ic, is->filename, is->iformat, &ffp->format_opts);
    if (err < 0) {
        print_error(is->filename, err);
        ret = -1;
        goto fail;

    }

第四處:探測(cè)數(shù)據(jù)失敗,拿不到視頻解碼信息和寬高之類的淡溯。
一般都不會(huì)失敗读整,忽略。

 err = avformat_find_stream_info(ic, opts);

    for (i = 0; i < orig_nb_streams; i++)
        av_dict_free(&opts[i]);
    av_freep(&opts);

    if (err < 0) {
        av_log(NULL, AV_LOG_WARNING,
               "%s: could not find codec parameters\n", is->filename);
        ret = -1;
                //ffp->last_error = last_error;
        goto fail;
    }

第五處: 沒(méi)有音視頻流咱娶。這種情況是鏈接有效米间,但是不是可播放鏈接。
一般都不會(huì)失敗膘侮,忽略车伞。

if (is->video_stream < 0 && is->audio_stream < 0) {
        av_log(NULL, AV_LOG_FATAL, "Failed to open file '%s' or configure filtergraph\n",
               is->filename);
        ret = -1;
        goto fail;
}

準(zhǔn)備工作完成,如果前面都沒(méi)error異常喻喳,那恭喜你另玖,接下來(lái)是進(jìn)入收數(shù)據(jù)包了。

第六處:
循環(huán)收數(shù)據(jù)流的消息其實(shí)很簡(jiǎn)單表伦,只有1處:
當(dāng)沒(méi)有數(shù)據(jù)了谦去,流斷開了(具體場(chǎng)景可能是你的wifi斷了,主播斷了等等等)

//http network cut
if (ffp->error) { 
      ffp_notify_msg1(ffp, FFP_MSG_ERROR);
} 

// 1. http or rtmp zhubo active close
// 2. rtmp network cut(eg. close wifi)
else { 
      ffp_notify_msg1(ffp, FFP_MSG_COMPLETED);
}

注釋:當(dāng)沒(méi)流數(shù)據(jù)的時(shí)候蹦哼,
如果數(shù)據(jù)異常ffp->error鳄哭,那么就是ERROR,
否則就是COMPLETED纲熏。

不同的協(xié)議這里的提示不一樣的妆丘,這里我做過(guò)驗(yàn)證.

  • 斷開wifi的時(shí)候:
    a. 如果是http+flv的直播锄俄,會(huì)提示ERROR. (因?yàn)樽遠(yuǎn)ttp.c http_read讀取失敗,返回-110的ERROR)
    b. 如果是rtmp的流勺拣,沒(méi)有ERROR提示(ffp->error=0)奶赠, 會(huì)提示COMPLETED。

  • 如果主播主動(dòng)關(guān)閉
    都是提示COMPLETED


** 代碼分析完畢药有,再說(shuō)說(shuō)方案(參考我最近幾天的思考毅戈,之前項(xiàng)目的做法,可能也有考慮不到的地方) :**

流程和邏輯要盡量簡(jiǎn)潔愤惰,清晰苇经,因?yàn)樵胶?jiǎn)潔的邏輯,越正確宦言,bug越少扇单。
總共有三層邏輯關(guān)系:

三層關(guān)系.png

A: 對(duì)ijkplayer底層C代碼而言,ff_ffplay.c唯一能做的就是根據(jù)各種異常奠旺,拋出對(duì)應(yīng)的錯(cuò)誤提示蜘澜。

B: 中間層API把底下的接口重新封裝,并把回調(diào)消息透?jìng)鞯缴厦?/p>

這是之前和產(chǎn)品討論的一直方案:


處理流程圖.png

參考方案:(以前公司做過(guò)的線上直播項(xiàng)目:中國(guó)移動(dòng)物聯(lián)網(wǎng)監(jiān)控平臺(tái))
底層拋出的ERROR和COMPLETED凉倚, 應(yīng)用層不管拿到哪種消息,都是重連兩次嫂沉,每次間隔3秒稽寒。如果還失敗了就報(bào)直播結(jié)束(無(wú)需判斷網(wǎng)絡(luò)情況或者其它,這種方案簡(jiǎn)潔實(shí)用趟章,應(yīng)用層只有調(diào)一下重連接口即可杏糙,因?yàn)橛脩粢膊粫?huì)過(guò)度關(guān)注提示)。

我的想法基本類似:這也是FY目前iOS項(xiàng)目的做法蚓土,就是當(dāng)應(yīng)用C層收到不管是ERROR和COMPLETED宏侍, 都重連N次,每次間隔N秒蜀漆。如果還失敗了就報(bào)直播結(jié)束谅河。

如果產(chǎn)品一定要參考處理流程圖.png的做法,那最好是簡(jiǎn)化一點(diǎn)确丢,因?yàn)檫@個(gè)做法判斷有的多绷耍,建議簡(jiǎn)化應(yīng)用層的處理邏輯,我覺(jué)得應(yīng)用層的代碼不要超過(guò)10行鲜侥。

應(yīng)用層可以自己用中間層api的接口做重連褂始;
如果需要,中間層也可以提供重連接口描函,iOS就是調(diào)用的底下封裝的重連接口replay崎苗,邏輯很簡(jiǎn)單狐粱,Android的我也已經(jīng)做好:

public void replay {
  setDisplay(sh);  // 顯示的Surface,備份之前顯示的
  reset(); //重置
  if(player != null) 
  {    
    player.setDataSource(url); //設(shè)置url
  }
    prepareAsync();  // 準(zhǔn)備播放
}

回到我們的產(chǎn)品:因?yàn)榉?wù)器也會(huì)發(fā)主播主動(dòng)停止推流的消息胆数,而且一旦收到這個(gè)消息肌蜻,那100%就是準(zhǔn)的,所以提示語(yǔ)的話幅慌,我個(gè)人建議是:
收到服務(wù)器主播關(guān)閉直播的消息:主播關(guān)閉了直播宋欺。
其它底下拋出的消息,重連后失敗一概是:直播結(jié)束胰伍。


一語(yǔ):就是應(yīng)用層C收到中間層B的消息齿诞,重連一次(調(diào)replay),不成功的話骂租,N秒后祷杈,再重連一次,失敗了就彈出錯(cuò)誤提示渗饮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末但汞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子互站,更是在濱河造成了極大的恐慌私蕾,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胡桃,死亡現(xiàn)場(chǎng)離奇詭異踩叭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)翠胰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門容贝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人之景,你說(shuō)我怎么就攤上這事斤富。” “怎么了锻狗?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵满力,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我轻纪,道長(zhǎng)脚囊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任桐磁,我火速辦了婚禮悔耘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘我擂。我一直安慰自己衬以,他們只是感情好缓艳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著看峻,像睡著了一般阶淘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上互妓,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天溪窒,我揣著相機(jī)與錄音,去河邊找鬼冯勉。 笑死澈蚌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灼狰。 我是一名探鬼主播宛瞄,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼交胚!你這毒婦竟也來(lái)了份汗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝴簇,失蹤者是張志新(化名)和其女友劉穎杯活,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熬词,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旁钧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荡澎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片均践。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晤锹,死狀恐怖摩幔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鞭铆,我是刑警寧澤或衡,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站车遂,受9級(jí)特大地震影響封断,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舶担,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一坡疼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衣陶,春花似錦柄瑰、人聲如沸闸氮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蒲跨。三九已至,卻和暖如春授翻,著一層夾襖步出監(jiān)牢的瞬間或悲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工堪唐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巡语,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓羔杨,卻偏偏與公主長(zhǎng)得像捌臊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兜材,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理理澎,服務(wù)發(fā)現(xiàn),斷路器曙寡,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,500評(píng)論 25 707
  • 為期16天的特種兵培訓(xùn)結(jié)束啦糠爬!今晚最后的一次主持人,給了我举庶,特別榮幸执隧。感恩小白龍老師一路陪伴教導(dǎo),讓我成功蛻變了户侥。...
    小言譚英閱讀 211評(píng)論 0 0
  • 文/此木成柴 01 為什么你一直單身镀琉,還沒(méi)有談過(guò)戀愛(ài)? 有這樣一群女性蕊唐,二十多歲了屋摔,至今仍未曾交往過(guò)男朋友,身邊沒(méi)...
    大臉元要練筆桿子閱讀 199評(píng)論 0 4
  • 特別喜歡今天這個(gè)主題:不會(huì)替梨,你就去學(xué)钓试;不懂,就去問(wèn)副瀑;沒(méi)有弓熏,就去創(chuàng)造! 今天早上起來(lái)主動(dòng)給G先生和淼淼獻(xiàn)上了我的七夕...
    小恩叨逼叨閱讀 592評(píng)論 1 3