1. 程式人生 > >FFmpeg命令讀取RTMP流如何設定超時時間

FFmpeg命令讀取RTMP流如何設定超時時間

子標題:FFmpeg命令錄製RTMP流為FLV檔案時如何設定超時時間 | FFmpeg命令如何解決錄製產生阻塞的問題  
0x001: 前言


今天在測試程式時遇到兩個問題。
Q1:ffmpeg錄製RTMP流並儲存為FLV檔案時,推RTMP流的執行緒已經結束斷掉了,而錄製的執行緒卻還一直在錄。
Q2:ffmpeg錄製RTMP流並儲存為FLV檔案時,被錄製的RTMP流並未推流或並無此房間頻道,而錄製的執行緒卻還一直在錄。

觀察日誌檔案發現錄製程式一直阻塞在某個時間點上,經查驗這是因為ffmpeg在拉取RTMP流時只要流媒體伺服器能正常訪問,不管當前拉取的流是否能正常訪問都不會退出。
舉個例子:rtmp://192.168.1.100:1935/live/changfang,只要192.168.1.100:1935這個伺服器地址是能正常請求通的,不管當前changfang頻道有沒有在推流,ffmpeg都會阻塞至此。當你把整個伺服器down掉,你會發現ffmpeg錄製的程式會立馬退出不再阻塞。此時第一個想法就是尋找設定超時的命令引數。

0x002: 解決方案


遇到問題就找找有沒有前人也遇到類似情況,找了一遍基本是C++程式碼如何解決的問題,沒有ffmpeg命令相關的結果。於是檢視命令幫助,尋找timeout字眼,找了很多引數,經多次嘗試發現有個 -rw_timeout

這是官方描述:
-rw_timeout        <int64>      ED....... Timeout for IO operations (in microseconds) (from 0 to I64_MAX) (default 0)


讀取流也屬於IO操作,但此處要注意兩點:1.引數單位是微秒,而不是秒。1秒(s)=1000000微秒(μs)   2.引數要放在開流前,否則不會生效

更改前的命令(為了便於分析觀看,只留最基礎的命令):

ffmpeg -i rtmp://192.168.1.100:1935/live/changfang -c copy -f flv /opt/video/123.flv

更改後的命令:

ffmpeg -rw_timeout 5000000 -i rtmp://192.168.1.100:1935/live/changfang -c copy -f flv /opt/video/123.flv


這樣,不管是推流結束還是從未推過流,只要ffmpeg在開流時,IO操作超過設定的秒數,就會自動退出。(如果你讀取的流是外網流或內網流不太通暢的情況下,不建議你把此時間設定過短,因為ffmpeg在錄製時從開流到產生FLV錄製檔案也需要時間)

 

0x003: 完結


如果你正好遇到此問題,希望能幫到你!