ffmpeg設置avformat_open_input( )超時 -stimeout

ffmpeg用avformat_open_input()解析網絡流時,默認是阻塞的。網絡

當遇到解析錯誤的網絡流時,會致使該函數長時間不返回。tcp

爲此能夠設置ffmpeg的-stimeout 的參數,要注意 -stimeout的單位是us 微妙。函數

用法就是設置在解析的 url 以前 (這裏設置超時爲5秒)即:url

 「ffmpeg -stimeout 5000000  -i rtsp://admin:admin@192.168.7.102:554/h264...........」spa

或者:code

「ffmpeg -stimeout 5000000 -rtsp_transport tcp  -i rtsp://admin:12345@172.16.7.166:554/h264.....」orm

 

備註:-stimeout 設置在你要解析的url以後是沒有做用的。input

=============================================it

從網絡上搜索到的有關資料:form

一:

去看ffmpeg的tcp.c的源代碼(會阻塞的網絡地址基本都是tcp協議),搜索上面兩個關鍵字,就明白是如何退出了。我以前的文章只說了open的時候阻塞,其實網絡環境複雜,有可能在read或write時候斷網或阻塞異常。但根基倒是在tcp.c這個文件裏。把interrupt_callback和timeout設置好了,就能夠解決這些問題。

二:

ffmpeg的avformat_open_input()默認是阻塞的,用戶能夠經過設置「ic->flags |= AVFMT_FLAG_NONBLOCK;」設置成非阻塞(一般是不推薦的);或者是設置timeout設置超時時間;或者是設置interrupt_callback定義返回機制。

附一段代碼參考下吧。

    ic = avformat_alloc_context();
    if(ic == NULL){
        ERR("error avformat_alloc_context \n");
        return -1;
    }
    ic->interrupt_callback.callback = tvie_decode_interrupt_cb;
    ic->interrupt_callback.opaque = handle;


    //ic->flags |= AVFMT_FLAG_NONBLOCK;


    if(strncmp(handle->params.path, "rtmp:", sizeof("rtmp:")) == 0){
        av_dict_set(&opts, "timeout", "6", 0); // in secs


    }
    else if(strncmp(handle->params.path, "http:", sizeof("http:")) == 0){
        av_dict_set(&opts, "timeout", "6000", 0); // in ms
    }

    err = avformat_open_input(&ic, handle->params.path, NULL, &opts);

相關文章
相關標籤/搜索