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

子標題:FFmpeg命令錄製RTMP流爲FLV文件時如何設置超時時間 | FFmpeg命令如何解決錄製產生阻塞的問題  
0x001: 前言html


今天在測試程序時遇到兩個問題。
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_timeoutide

這是官方描述: -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

更改後的命令:spa

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: 完結日誌


若是你正好遇到此問題,但願能幫到你!


code

原文出處:https://www.cnblogs.com/zhifa/p/12345376.htmlhtm

相關文章
相關標籤/搜索