子標題: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: 完結
如果你正好遇到此問題,希望能幫到你!
------------------------------------------------------------ 2020-11-20 11:14:23 ------------------------------------------------------------
首先,感謝底部評論的那位兄台,給本博文彌補了空缺,為其他再有機會看本文的園友提供更明確的思路及填坑方法。
其次,這里再詳細貼一下 -rw_timeout 與 -stimeout 的用途。
下面是命令幫助詳細描述:
小姐(結):從幫助文檔可以看出 -rw_timeout 的作用范圍是 URLContext,-stimeout 的作用范圍是 RTSP demuxer 與 RTSP muxer 。