Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

使用 ffmpeg 透過 rtsp 轉資料給 Darwin Streaming Server 播放
post by tommy @ 13 十二月, 2013 09:59

這幾天發現原本使用 VLC 將電視卡的訊號轉送到 Darwin Streaming Server 播放的功能沒有作用了. 我記得之前最後一次試好像有半年了吧.... 與之前的差異應該就是 Kernel 不一樣 (v4l2 的 driver 可能有變), Debian 版本不一樣 (幾個星期前由 stable 轉到 unstable 使用), 加上 VLC 的版本不一樣 (之前應該只有 2.0.x 的版本, 目前是 2.1.1).

kernel, 特地抓舊的 3.4 與 3.10 的版本來測, 結果一樣. VLC, 自己編個 2.1.0 來用, 結果一樣.... 想編個 2.0.x 的版本, 結果一直試不成功. Debian 的版本..... 想到要由備份放回去就懶了... 加上, 除了 VLC 不能讀到 v4l2 出來的資料外, 其他的程式 (mencoder, ffmpeg) 都很正常, 看起來應該是 VLC 本身的問題才對. 不過.... 到 VLC 的網站, 又看不到有人反應相同的問題.... 難道只有我碰到?

由於 ffmpeg 與 mencoder 仍可以用, 所以就乾脆換個程式來處理. 先試了 mencoder, 實在找不出把資料串流出去的方式, 似乎都只能存成檔案. 所以... 就改用 ffmpeg 來處理.

由於 ffmpeg 對於 v4l2 的支援參數, 似乎沒有 VLC 來的細, 所以, 很多東西我們必須先用 v4l2-ctl 或 v4lctl 來設定, 然後再用 ffmpeg 來轉檔.

VLC 在與 Darwin Streaming Server 搭配時, 是去指定 .sdp 檔案在產生的 local 路徑... 不過在 ffmpeg 上頭, 並沒有看到類似的參數, 試了很久, 終於發現直接送到 rtsp://dss_server/file.sdp 這樣的路徑, DSS 收到就會自動產生 file.sdp 出來了.

所以... 用類似下面的 script 來轉:

/usr/bin/ffmpeg -re -f alsa -i hw:1,0 -f v4l2 -s 720x480 -i /dev/video0 -ac 2 -c:a libfdk_aac -b:a 32k -c:v libx264 -b:v 768k -f rtsp rtsp://127.0.0.1/live_tv.sdp

如果 CPU 不夠快, 指定 bitrate 的方式可能會效果不太好....可以考慮改用 preset 的方式來處理.

/usr/bin/ffmpeg -re -f alsa -i hw:1,0 -f v4l2 -s 720x480 -i /dev/video0 -ac 2 -c:a libfdk_aac -b:a 32k -c:v libx264 -preset superfast -f rtsp rtsp://127.0.0.1/live_tv.sdp

我試過在 Celeron 847E 的 CPU 上頭, 使用 veryfast, superfast, ultrafaster 這三個 preset, 都仍可以維持 fps 在 30 以上, 畫質也不錯 (用 faster 就偶爾會掉到 fps 30 以下)... 如果指定 bitrate 的方式來處理, 不管設大或小, 都只有 fps 1x 的表現.

至於頻寬... 看起來 superfast 約在 250KB/s-350KB/s 之間跳動, 算是可以接受的大小.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 48 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS