您好,登錄后才能下訂單哦!
本文是我的《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 獲取最新的文章和資訊。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。