8、設置I/O中斷機制
在 demux 時,我們首先需要調用 avformat_open_input() 打開一個輸入,然后循環調用 av_read_frame() 函數來讀取輸入。
我們要注意的是: avformat_open_input() 和 av_read_frame() 都是阻塞函數,如果不能讀取到足夠的數據,那么它們將會一直阻塞。對于讀取本地文件而言,這不是什么問題,但當我們讀取的是網絡上的實時流時,尤其是網絡的情況不太好的情況下,就可能導致這個長時間的阻塞。
而在實際的代碼中,我們可能不能讓它們一直阻塞在這里,我們需要超過一定時長時返回,去處理其他一些事情,然后再嘗試去重新調用這兩個函數,去讀取數據,這時候,我們就需要設置中斷機制。
第一種方法是,使用 option 來設置中斷,不同的協議需要使用的 option 也不太一樣,比如 rtsp ,它使用私有選項 stimeout 設置中斷,tcp 使用私有選項 timeout 設置中斷等等。使用時,需要去查詢相關協議的具體說明。
//設置rtsp超時
AVDictionary* opts = NULL;
//設置tcp or udp,默認一般優先tcp再嘗試udp
av_dict_set(&opts, "rtsp_transport", "tcp" 或"udp", 0);
av_dict_set(&opts, "stimeout", "1000000", 0);//設置超