OSC香川のことまとめてないね
さーせん。がんばります。
_ IEEE1394カメラとたった一行でUstream.tv高画質配信できた
ffmpegを使っての高画質配信は日経Linuxに載ってたことなので珍しいもんでもないけど、たった一行で高画質配信できたので見てくださいな。
RTMPでストリーミングしていると140秒ほどでffmpegが落ちるので実用では使えません。 ごめんなさい。 ~~~~
2012.2.12追記
衝撃の事実が判明しました。 「 □LinuxでUstream(ffmpegで高解像度配信!?完結編) | Linux Install Memo 」さんの情報によると、rtmpのflashverを "flashver=FMLE/3.0"としていた部分を "flashver= FME /3.0" とすれば、落ちること無く使えるそうです。
え…。orz
ということで、ここの記述も変更しました。
1. Ustream.tvからFlash Media Encoderの設定ファイルをダウンロードする
Ustream.tvにログインして「番組設定」の「その他の設定」を開き、 「詳細設定」の「Flash Media Encoder XML ファイル」からFlash Media Encoderの設定ファイルをダウンロードしておきます。
2. 自分の番組番号と番組に設定された文字列を確認する
エディタで ustream.fme.(番組名).xml を開いて、以下の個所を確認しておく。 文字コードは UTF-16LE です。
<output>
<rtmp>
<url>rtmp://1.(番組番号).fme.ustream.tv/ustreamVideo/(番組番号)</url>
<backup_url></backup_url>
<stream>(ランダムな文字列)offair</stream>
</rtmp>
</output>
3. IEEE1394でカメラをつないでコマンドを実行。
dvgrabのrawストリームをパイプでつないでffmpegに流しこんでます。
コマンドの説明をするとdvgrabはフォーマットをDV raw(-f raw)に設定してハイフンで標準出力に流します。 ffmpegではDVフォーマット(-f dv)をハイフンで標準入力からdvgrabのデータを受けます。
あとはFMEの設定ファイルを見ながら、解像度(-s 320x240)、フレームレート(-r 15)、オーディオサンプリングレート(-ar 22050)、オーディオビットレート(-ab 48k)、映像ビットレート(-b 300k)、出力フォーマットにflv(-f flv)を指定し、rtmpで出力します。 rtmpの指定はFMEの設定で確認した番組番号とランダムな文字列を指定すればOKです。
$ dvgrab -f raw - | ffmpeg -f dv -i - -s 320x240 -r 15 -ar 22050 -ab 48k -b 300k -f flv 'rtmp://1.(番組番号).fme.ustream.tv/ustreamVideo/(番組番号)/(ランダムな文字列)offair flashver=FME/3.0\20(compatible;\20FMSc/1.0)'
4. Ustream.tvのライブ配信ページを開きます
Ustream.tvの「ライブ配信」ボタンを押して、「より高画質へ」ボタンが表示されなければ成功です。
失敗しているときは、「より高画質へ」ボタンが表示されています。
5. 感想
他のページでffmpegの高画質配信は重いと書いてるけど、dvgrabとffmpegを使っての配信は言うほど重くないよ。 ていうかwebcamstudioがパワーをバカ食いするので、それと混同しているような気がする…。
これの応用としては日経Linuxに載ってたようにwebcamstudioを使ってvloopbackの出力からffmpegにつないだり、音声にpulseを使ってミキシングしたりできますね。
(2011.2.10追記)
ffmpegに「-f alsa -i pulse」と追加すれば問題なくPulseで使えました。 ステレオで配信する場合は「-ac 2」(オーディオチャンネルを2)と追加します。
$ dvgrab -f raw - | ffmpeg -f dv -i - -s 320x240 -r 15 -f alsa -i pulse -ar 22050 -ab 48k -ac 2 -b 300k -f flv 'rtmp://1.(番組番号).fme.ustream.tv/ustreamVideo/(番組番号)/(ランダムな文字列)offair flashver=FME/3.0\20(compatible;\20FMSc/1.0)'
h.264で配信する場合はオプションを「-vcodec libx264 -vpre medium」とつけます。vpreはx264のプリセットで、/usr/share/ffmpeg/以下にlibx264-*という形で置いてあるので、その名前を指定します。 にしても、さすがにh.264でエンコードさせると重たい…。
$ dvgrab -f raw - | ffmpeg -f dv -i - -s 320x240 -r 15 -f alsa -i pulse -ar 22050 -ab 48k -ac 2 -vcodec libx264 -vpre medium -b 300k -f flv 'rtmp://1.(番組番号).fme.ustream.tv/ustreamVideo/(番組番号)/(ランダムな文字列)offair flashver=FME/3.0\20(compatible;\20FMSc/1.0)'