Gentoo/Linuxで高品質Ustream配信するよ!

どのくらい高品質なのか

下のコマンドでデスクトップをキャプチャした程度の画質になります

ffmpeg -r 20 -s 768x480 -f x11grab -i :0.0 -f alsa -i default \
-acodec libmp3lame -vcodec libx264 -b 300k -ar 22050 -ab 48k \
-threads 4 -vsync 1 -y -f flv out.flv


Linuxで高品質配信したっていいじゃない!

そもそもデフォルトの配信はFlash Playerでごにょごにょやってるようですが,
そいつがうまく動いてくれてない(高画質配信に対応してない?)んだと思います.
Windows/Mac用にはのFlash Media Live Encoderっていうのがあるらしいんですが,
Linux用は用意されていません.
そこで,Flash Playerで配信しようとするのを,やめます!!
Ustreamにはrtmpというプロトコル(ストリーミング配信用のやつ?)が用意されています.

Real Time Messaging Protocol (RTMP) とは、Adobe が開発している、
Adobe Flash プレーヤーとサーバーの間で、音声・動画・データを
やりとりするストリーミングのプロトコル。元々は Macromedia が開発
していて、Adobe に買収された。プロトコルの仕様は公開されている。
(Wikipediaより)

なるほど.こいつを使えばいいのですな.
幸いなことに,ffmpegはこのrtmpを使ってエンコードしたデータを送信することができるらしいです.

方法

そこで,とりあえずrtmpで送信できるようにffmpegコンパイルします.
Ubuntuとかの人は多分デフォルトのままで大丈夫らしいです.

USE="rtmp network" emerge -av ffmpeg

おもむろにEnterをッタターンッっとたたいたら,

  • Ustreamのサイトにアクセスします.
  • 自分のアカウントのダッシュボードにいく
  • 番組設定→詳細設定→「Flash Media Live Encoder のXMLファイルをダウンロード」をクリック
  • DLしたxmlファイルの中身をみる
<output>
	<rtmp>
		<url>rtmp://1.8765432.fme.ustream.tv/ustreamVideo/1234567</url>
		<backup_url></backup_url>
		<stream>e6a578cf852511312f8792408dd433a5offair</stream>
	</rtmp>
</output>

みたいなところがありますね!
このrtmp://...のところとe6...をつかって,送信先URIを生成します.

rtmp://1.8765432.fme.ustream.tv/ustreamVideo/1234567/e6a578cf852511312f8792408dd433a5offair flashver=FME/3.0\20(compatible;\20FMSc/1.0)

とりあえず,Ustreamライブ配信ページにアクセスしましょう!
Webカメラとかにアクセスしてもいい?とか聞かれますが,
めんどくさいので全部「お断りしますっ(キリッ」と答えます.
ここで配信ページにアクセスしないとデータが送れない可能性があったりなかったりするみたいです.

さぁ,ffmpegエンコードしたデータをここに送りますよ!さっき作ったURI使うよ.

ffmpeg -r 20 -s 768x480 -f x11grab -i :0.0+100,200 -f alsa -i default -acodec libmp3lame \
-vcodec libx264 -b 300k -ar 22050 -ab 48k -threads 4 -vsync 1 -y \
-f flv 'rtmp://1.8765432.fme.ustream.tv/ustreamVideo/1234567/e6a578cf852511312f8792408dd433a5offair  flashver=FME/3.0\20(compatible;\20FMSc/1.0)'

ffmpegのオプションはなんかてけとーに調整してくだしあ
ちょっとだけ解説します.

  • -r 20 : フレームレートです.今回は20fpsだよ!
  • -s 768x480 : サイズです.でっかくできるよ!
  • -f x11grab -i :0.0+100,200 : デスクトップをキャプチャするよ!
    • +100,200 は,画面の左上からx=100px,y=200pxのとこがキャプチャの左上になるよ!
    • -f video4linux2 -i /dev/video0 とかにするとWebカメラからとるよ!
  • -f alsa -i default : デフォルトのオーディオソースつかうよ!
  • -threads 4 : 4スレッドでエンコードするよ!
  • -f flv 'rtmp://... : rtmpustreamに送信するよ!

おもむろにEnterをッタターンッと叩いたら,たぶんエンコードとかはじまると思います.

Stream mapping:
  Stream #0.0 -> #0.0
  Stream #1.0 -> #0.1
Press [q] to stop, [?] for help
frame=79187 fps= 20 q=12.0 size=  139953kB time=01:05:56.82 bitrate= 289.8kbits/s dup=106 drop=12

多分右の方に「なんかサーバにデータが届いてるよ!」的なボタンがあるので,そいつをクリックします.
あら不思議!自分のデスクトップが映っているじゃありませんか!
すてきですね!!

できないこと

デスクトップキャプチャとWebカメラのシームレスな切り替えはできません.
一旦ffmpegを切ったあとにもっかいエンコードせにゃなりません.たぶん.
あと,どれくらいのビットレートまで大丈夫なのかは未検証です.

結論

ffmpeg使って吐ける動画は,Ustreamで配信することができる!
デスクトップ一面をmikutterにして配信するとか,
一部だけ配信してコーディングするとかができます!うれしい!!