H.264 Pro Recorder 與 Linux 直播應用
最近碰到了一顆 Blackmagic Design 的 H.264 Pro Recorder,它是一款多媒體編碼裝置,能夠接入諸如 SDI、HDMI 等訊號來源,再轉換為 H.264/AAC 串流並經由 USB 輸送至電腦。雖然這項產品的定位並未包含直播功能,在原廠為 Windows 及 macOS 所提供的專屬軟體套件裡,僅能夠對串流做本地播放或儲存的動作。但由於這年頭線上直播的需求增加了不少,使得 DR 必須研究看看是否有物盡其用的解決方案。
所幸在 GitHub 上發現有個名為 bmd-tools 的專案,看似能夠解決需求,於是便以 Fedora 31 作為實作環境來加以試驗。首先這需要 C 程式的編譯工具,可用 dnf 群組安裝指令一次性安裝起來:
- sudo dnf group install "C Development Tools and Libraries"
接著安裝 libusb 開發套件:
- sudo dnf install libusb-devel
下載、解開及編譯 bmd-tools 原始碼:
- wget https://github.com/fabled/bmd-tools/archive/v1.0.2.tar.gz
- tar zxvf v1.0.2.tar.gz
- cd bmd-tools-1.0.2
- make
該目錄下會編譯出 bmd-extractfw 及 bmd-streamer 這兩支程式,不過根據 README 文件的指示,還需要從原廠軟體裡取得裝置的韌體檔案。因此接著得前往 Blackmagic Design 網站的支援中心,下載 Windows 版本的 Desktop Video 套件。其中請留意,bmd-extractfw 似無法從 Desktop Video 11 以後的版本取出韌體檔,因此 DR 嘗試使用的版本為 10.11.4,下載後將其解壓縮:
- sudo dnf install msitools
- unzip Blackmagic_Desktop_Video_Windows_10.11.4.zip
- msiextract "Desktop Video Installer v10.11.4.msi"
在解開的目錄裡搜尋一下有無 BMDStreamingServer.exe 檔案,找到後將其複製到 bmd-tools 的原始碼目錄內以便後續作業。
進入 bmd-tools 原始碼目錄,並執行 bmd-extractfw 從 BMDStreamingServer.exe 取出韌體:
- cd bmd-tools-1.0.2
- ./bmd-extractfw < BMDStreamingServer.exe
完成前述步驟後,該目錄下應該會有 bmd-atemtvstudio.bin 及 bmd-h264prorecorder.bin 這兩個韌體檔案,至此 bmd-streamer 便應已可用。將 H.264 Pro Recorder 接上電源並接入媒體訊號,再將 USB 線接到電腦上,然後以 root 權限執行 bmd-streamer:
- sudo ./bmd-streamer -v
若程式正確執行,則讀取到的 H.264/AAC 串流會直接輸出至標準輸出(stdout),可以使用 Ctrl + C 來關閉程式;而這也表示可以透過管線將串流傳遞給其它程式,以實現進一步的需求。
可以另外使用 lsusb 來確認一下裝置的狀況。當裝置在接上電源後,初次連接到電腦時,lsusb 應該會顯示諸如以下資訊:
Bus 001 Device 008: ID 1edb:bd43 Blackmagic design
然後在執行 bmd-streamer 後,裝置就會被傳入對應的韌體檔,這時再執行 lsusb 則顯示資訊如下:
Bus 001 Device 009: ID 1edb:bd43 Blackmagic design H.264 Pro Recorder
如果希望能夠以一般使用者來執行程式,而不會出現「unable to open device: LIBUSB_ERROR_ACCESS」錯誤訊息,則可以新增 udev 規則,寫入到 /etc/udev/rules.d/50-bmd.rules。規則列舉如下:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1edb", ATTRS{idProduct}=="bd43", GROUP="wheel", MODE="0660"
前述規則會開放 wheel 群組的使用者存取 H.264 Pro Recorder 裝置,接著再執行以下指令使其生效:
- sudo udevadm control --reload-rules
- sudo udevadm trigger
bmd-streamer 可搭配 VLC 或 FFmpeg 做進一步應用,而這兩款軟體皆可從 RPM Fusion 套件庫取得。舉例來說,可使用 VLC 直接播放串流:
- ./bmd-streamer | vlc stream:///dev/stdin
或者,參考 EncodingForStreamingSites 的範例,以 FFmpeg 再處理及輸送至 YouTube 直播的指令如下:
- ./bmd-streamer --dst-width=1280 --dst-height=720 | ffmpeg -i - -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv rtmps://a.rtmp.youtube.com/live2/<串流金鑰>
前述指令有許多可以再調整的地方,舉例來說,由於 H.264 Pro Recorder 輸出的已經是 H.264/AAC 串流,按理講影像與音訊可以直接用複製的形式送出(-c:v copy 和 -c:a copy)。然而實測發現這樣送出給 YouTube 的聲音不是很可靠,所以最至少音訊都要再轉過。