一、問題背景
最近有個業務需求用到node中間層使用ffmpeg對rtsp流轉碼成MP4推給前端,本地開發基本完成並且能完美運行,但是通過docker部署時發現ffmpeg不能正常使用,根據Log一步步排查,發現可能時端口以及協議問題。
docker容器內環境:
- node v12.0
- Debian GNU/Linux 9
- ffmpeg 3.2.10-1~deb9u1
二、報錯問題
通過排查日誌,發現在docker中試用ffmpeg請求rtsp流時,UDP端口時無法返回的,報錯如下:
[rtsp @ 0x5650696e2580] UDP timeout, retrying with TCP
[rtsp @ 0x5650696e2580] method SETUP failed: 454 Session Not Found
[rtsp @ 0x5650696e2580] Could not find codec parameters for stream 0 (Video: h264, none): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
三、解決方案
-
嘗試創建容器時指定暴露一個UDP端口,但依然報錯,問題原因未知
-
強制將ffmpeg對rtsp拉流時試用tcp協議,目前有效,加上
-rtsp_transport tcp
參數
ffmpeg -rtsp_transport tcp -i 'rtsp://admin:[email protected]:554/cam/realmonitor?channel=17&subtype=0' -an -c:v copy -f mp4 -movflags +frag_keyframe+empty_moov+default_base_moof pipe:1
但是性能上是存在問題的,畢竟tcp需要多次握手,具體UDP爲什麼無法使用,問題還在排查中。