轉:https://blog.csdn.net/gzw19961018/article/details/103319112
使用ffmpeg推攝像頭視頻流中遇到的問題
- 問題一 推流不穩定,過10分鍾ffmpeg會自動停止
- 問題二 推流時不時報錯且拉下來的高清視頻流花屏,低分辨率情況稍好
- 問題三 ffmpeg拉流轉發頻繁丟包警告max delay reached. need to consume packet
問題一 推流不穩定,過10分鍾ffmpeg會自動停止
原因
推流語句不合適
解決方法—合適的推流語句
ffmpeg -i rtsp://admin_name:password@192.168.21.8:555/h264/ch1/main/av_stream -f flv -an rtmp://192.168.1.1:1900/live/test98
問題二 推流時不時報錯且拉下來的高清視頻流花屏,低分辨率情況稍好
階段性報錯 error while decoding MB xx xx
原因與解決方法
問題應該在於ffmpeg源文件udp.c中 ,UDP_MAX_PKT_SIZE值設置過小,將其增大2的整數倍。
修改后重新編譯FFmpeg
如何重新編譯
修改完成后保存,終端切換到ffmpeg文件夾下
sudo make
sudo make install
問題三 ffmpeg拉流轉發頻繁丟包警告max delay reached. need to consume packet
原因
rtsp協議默認使用udp導致的問題,讓rtsp強制使用tcp方式可以一定程度避免丟包。
解決方法
在指令中添加-rtsp_transport tcp
ffmpeg -rtsp_transport tcp -i
rtsp://admin_name:password@192.168.21.8:555/h264/ch1/main/av_stream -f flv -an rtmp://192.168.1.1:1900/live/test98
轉:https://zhuanlan.zhihu.com/p/73984438
ffmpeg cmd的參數實在太多,因此這里只介紹基礎的、以及筆者了解的跟讀者們做一個分享。
首先,來看一個將本地視頻文件推流到服務器的最基礎的命令:
ffmpeg -i ${input_video} -f flv rtmp://${server}/live/${streamName}
-i
:表示輸入視頻文件,后跟視頻文件路徑/URL。-f
:強制ffmpeg采用某種格式,后跟對應的格式。
上文有提到,RTMP一般用flv流數據,因此多設置-f flv
。
接着,另一個基本需求,就是在推流的時候希望不要加上音頻,這個也好實現:
ffmpeg -i ${input_video} -vcodec copy -an -f flv rtmp://${server}/live/${streamName}
-vcodec
:指定視頻解碼器,v
是視頻video
,codec
就是解碼器,后跟解碼器名稱,copy
表示不作解碼;-acodec
:指定音頻解碼器,同理,a
是audio
,后跟解碼器名稱。an
代表acodec none
就是去掉音頻的意思。
關於a/v
的寫法很多,除了上面介紹的,還有-c:v copy -c:a copy
等
筆者遇到過2個推流失敗的case:
- 推一個RTSP攝像頭的流數據時,一旦打開該攝像頭的音頻軌道就會在
av_interleaved_write_frame()
函數處出錯。(返回碼不記得了) - 使用英飛拓某幾款攝像頭推流時,總是失敗,返回碼顯示-33。
以上2個問題都成功定位問題所在:
- 操作人員在打開音頻軌道時總是同時打開2個音頻軌道,只要選擇關閉其中1個音頻,馬上就可以推流了;
- 這幾款攝像頭同時包括多個視頻碼流,似乎他們會通過RTSP同時把多個碼流同時傳過來;最后在代碼中強行過濾視音頻碼流,只保留一路視頻+一路音頻就可以了。
原因歸結為一個:flv格式至多只能包括一個視頻流和一個音頻流。