Raspberry PI から UStream 配信(H.264ハードエンコ)
以前のエントリでuserlandなアプリがビルド出来るようになったので、H.264エンコーダを使うraspividを改造して、UStreamに配信してみるお。
配信アプリの作成
- 配信アプリのコマンド(ttraspi)を新規作成。raspividのmain()関数をttraspiから呼び出す仕組み。
- raspividのソースを改造して、1フレームエンコードする度にコールバック関数を呼ばせる。また、H.264のエンコーダパラメータ初期値を少々いじる必要あり。
- ttraspi側のコールバックからRTMP配信用のAPI(自作)を呼んで配信させる。
キャプチャのサイズとかビットレートとかはraspividのコマンドラインオプションで設定出来るようになっているのでそのまま流用。
H.264コーデック
raspividのデフォルトではSPS/PPSが最初の1回しか出ない。
ファイル出力用だとそれで良いんだけど、ストリーミングの場合はI-Pic毎にSPS/PPSを出してやる必要があるので、そこら辺はコールバック側で最初のSPSたちを覚えておいて、I-Pic時に追加するように実装。
※ 後で分かったことですが、エンコーダの初期パラメータにフラグを立ててやるとちゃんとGOPごとにSPS/PPSが出るようです。
ただ、SPSのパラメータにアスペクト比が入ってなかったり、B-Picを有効にする方法がわからなかったり。。エンコーダ設定ではどうにも変えられなかったのでそこはBCM2835の仕様なのかも。
公開
ひっそり公開してみたお。
最初デフォルト(1920x1080 30fps)のまま配信しようとしたら全然絵が動かないんでビビった。↑のはVGA(640x480) 30fps 300kbps で配信。
CPU使用率が4%程度!さすがハードエンコですな。
フレームレートも良い感じでスムーズに動いてる。
文字レイヤも重ねて配信したいなぁ。。(続くかも)