溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

FFMPEG Tips (4) 如何中斷阻塞的網(wǎng)絡(luò)線程

發(fā)布時(shí)間:2020-06-13 13:50:44 來(lái)源:網(wǎng)絡(luò) 閱讀:7050 作者:Jhuster 欄目:開(kāi)發(fā)技術(shù)

本文是我的《FFMPEG Tips》系列的第四篇文章,前面的文章有提到如何提取碼流信息、如何讀每一幀的數(shù)據(jù),這些都是離不開(kāi)網(wǎng)絡(luò)操作,例如:使用 ffmpeg 讀取一個(gè)碼流,常規(guī)的代碼流程示例如下:


AVFormatContext *ic = avformat_alloc_context();

if (avformat_open_input(&ic, url, NULL, NULL) < 0) {
    return -1;
}

if (avformat_find_stream_info(ic, NULL) < 0) {
    return -1;
}

AVPacket avpkt;
av_init_packet(&avpkt);

while (!abort_request) {
    int ret = av_read_frame(ic, &avpkt);
    if (ret < 0) {
        break;
    }
    // processing
}

av_free_packet(&avpkt);


其中,


- avformat_open_input 主要負(fù)責(zé)連接媒體服務(wù)器,以及讀取碼流的頭信息

- av_read_frame 主要負(fù)責(zé)每次讀取一幀數(shù)據(jù),包括解協(xié)議和解封裝


這兩個(gè)函數(shù),都有可能會(huì)出現(xiàn)耗時(shí)很長(zhǎng)或者阻塞的情況,比如:


- 網(wǎng)絡(luò)很爛或者很不穩(wěn)定

- 服務(wù)器響應(yīng)比較慢

- 直播流不存在或者沒(méi)有數(shù)據(jù)


因此,我們需要一個(gè)中斷機(jī)制,在等待超時(shí)或者退出播放的時(shí)候,就可以輕松中斷掉這個(gè)阻塞過(guò)程。


ffmpeg 提供了一個(gè)很簡(jiǎn)單的回調(diào)機(jī)制,即注冊(cè)一個(gè)自定義的回調(diào)函數(shù),用于外部中斷阻塞的網(wǎng)絡(luò)操作,用法如下所示:


static int custom_interrupt_callback(void *arg) {
    if (timeout || abort_request) {
        return 1;
    }
    return 0;
}

AVFormatContext *ic = avformat_alloc_context();
ic->interrupt_callback.callback = custom_interrupt_callback;
ic->interrupt_callback.opaque = custom_arg;


當(dāng)自定義的回調(diào)函數(shù)返回 1,則會(huì)產(chǎn)生中斷。因此,我們可以在等待超時(shí)或者退出播放器的時(shí)候,將 timeout 或者 abort_request 置為 1 來(lái)達(dá)到中斷當(dāng)前的網(wǎng)絡(luò)阻塞過(guò)程的目的。


本文的知識(shí)點(diǎn)就這么多,關(guān)于如何中斷阻塞的網(wǎng)絡(luò)線程就介紹到這兒了,文章中有不清楚的地方歡迎留言或者來(lái)信 lujun.hust@gmail.com 交流,關(guān)注我的新浪微博 @盧_俊 或者 微信公眾號(hào) @Jhuster 獲取最新的文章和資訊。


FFMPEG Tips (4) 如何中斷阻塞的網(wǎng)絡(luò)線程

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI