亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

FFMPEG Tips (4) 如何中斷阻塞的網絡線程

發布時間:2020-06-13 13:50:44 來源:網絡 閱讀:7055 作者:Jhuster 欄目:開發技術

本文是我的《FFMPEG Tips》系列的第四篇文章,前面的文章有提到如何提取碼流信息、如何讀每一幀的數據,這些都是離不開網絡操作,例如:使用 ffmpeg 讀取一個碼流,常規的代碼流程示例如下:


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 主要負責連接媒體服務器,以及讀取碼流的頭信息

- av_read_frame 主要負責每次讀取一幀數據,包括解協議和解封裝


這兩個函數,都有可能會出現耗時很長或者阻塞的情況,比如:


- 網絡很爛或者很不穩定

- 服務器響應比較慢

- 直播流不存在或者沒有數據


因此,我們需要一個中斷機制,在等待超時或者退出播放的時候,就可以輕松中斷掉這個阻塞過程。


ffmpeg 提供了一個很簡單的回調機制,即注冊一個自定義的回調函數,用于外部中斷阻塞的網絡操作,用法如下所示:


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;


當自定義的回調函數返回 1,則會產生中斷。因此,我們可以在等待超時或者退出播放器的時候,將 timeout 或者 abort_request 置為 1 來達到中斷當前的網絡阻塞過程的目的。


本文的知識點就這么多,關于如何中斷阻塞的網絡線程就介紹到這兒了,文章中有不清楚的地方歡迎留言或者來信 lujun.hust@gmail.com 交流,關注我的新浪微博 @盧_俊 或者 微信公眾號 @Jhuster 獲取最新的文章和資訊。


FFMPEG Tips (4) 如何中斷阻塞的網絡線程

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临湘市| 汉川市| 黔南| 西充县| 马尔康县| 时尚| 富锦市| 宁乡县| 遂昌县| 凤台县| 凉城县| 兴仁县| 远安县| 太谷县| 曲水县| 鹰潭市| 佛坪县| 玉环县| 阳山县| 文安县| 江山市| 资源县| 类乌齐县| 江西省| 清新县| 仁怀市| 吴堡县| 子洲县| 秦安县| 浪卡子县| 道真| 青海省| 炎陵县| 河曲县| 克拉玛依市| 绥化市| 大埔区| 耒阳市| 清原| 茶陵县| 旬邑县|