這幾天發現原本使用 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 之間跳動, 算是可以接受的大小.