OSC香川のことまとめてないね

nogajun
nogajun

_

さーせん。がんばります。

_ 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)'