91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

太白县| 三台县| 海盐县| 抚顺县| 鞍山市| 和平县| 扎兰屯市| 紫阳县| 句容市| 正宁县| 遂昌县| 德江县| 吉木乃县| 谷城县| 丰顺县| 三穗县| 汾阳市| 高碑店市| 通山县| 城口县| 宕昌县| 久治县| 江川县| 布拖县| 安乡县| 连云港市| 奉贤区| 交城县| 岱山县| 车险| 邵东县| 棋牌| 咸宁市| 谷城县| 墨玉县| 盐亭县| 宝应县| 五寨县| 万州区| 深泽县| 崇义县|