現在、Windows以外でのライブストリーミングの方法は確立されて無いので、失敗例を集めていけたらいいですね

PeerCastStation(rtmp)で配信する

PeerCastStationはrtmp sourceに対応しています. なのでflvでエンコードした動画を直接渡すことができます. LinuxでのWMVの扱いは多少難があるのでこちらのほうが主流になっていくと思います.

monoを準備する

LinuxでのPeerCastStationの動作にはmonoが必要です. Archlinuxの場合には以下のコマンドでインストールできます.

# pacman -S mono

snd-aloopでステレオミキサーの代用をする

BGMを流す方法は色々ありますが,ここではsnd-aloopを使ったものを紹介します. まず以下のようにsnd-aloopモジュールを有効化します.

# modprobe snd-aloop pcm_substreams=1 enable=1

aliasを付けて指定するときに楽なようにしておきます. card/deviceの番号は環境によって異なります.

$ aplay -l
$ arecord -l

というコマンドで"Loopback"と表示されているのが, snd-aloopによって生成されたデバイスです.

  • $HOME/asoundrc
pcm.loopin {
    type hw
    card 1
    device 0
}

pcm.loopout {
    type hw
    card 1
    device 1
}

alsaに対応した適当なメディアプレイヤーで出力先にloopoutを指定します.

$ mplayer -ao alsa:noblock:device=loopout http://sj128.hnux.com

ffmpeg側での録音の指定は以下のようにします.

$ ./ffmpeg -f alsa -i loopin ...
$ ./ffmpeg -f alsa -i loopin -sample_fmt s16 ...
$ ./ffmpeg -f alsa -i plug:loopin ...

マイクとBGMを同時に録音する

通常,マイク入力はモノラルなのでrouteでステレオに変換してやります. format_convertは環境によっては必要ないかもしれません.

  • $HOME/asoundrc
pcm.format_convert {
    type plug
    slave {
        pcm "hw:0,0"
        format S24_3LE
        channels 2
        rate 48000
    }
}

pcm.left_mic {
    type route
    slave {
        #pcm "hw:0,0"
        pcm format_convert
        channels 2
    }
    # dst.src vol
    ttable.0.0 5
    ttable.1.0 5
}

BGMとマイクの2つの入力を1つにまとめるにはamixフィルタを使います.

$ ffmpeg -f alsa -i plug:loopin -f alsa -i plug:left_mic -filter_complex amix=inputs=2  ...

ffpmegでの配信

まずPeerCastStationのブラウザUIから配信を開始します.

ffmpgeのコマンドはこのようになります. 入力の音声・映像のソースは各自の環境に応じて変更してください. 最後に"-f flv rtmp://localhost:1935"でPeerCastStaionに渡しているところがポイント.

$ ffmpeg -f alsa -i plug:loopin -f alsa -i plug:left_mic -filter_complex amix=inputs=2 -f fbdev -i /dev/fb0 -vf crop=640:480:0:0 -s 640x480 -r 10 -vcodec libx264 -pix_fmt yuv420p -threads 0 -tune zerolatency -async 1 -preset ultrafast -x264opts bitrate=512:vbv-maxrate=512:vbv-bufsize=1024 -acodec libmp3lame -ar 44100 -b:a 64k -ac 2 -f flv rtmp://localhost:1935

Linux環境

Linux環境で配信に使えそうなソフト

  • screencast4linux
  • Xvidcap
  • Istanbul
  • recordMyDesktop
  • FFMpeg
  • VLC media player

画面取り込みの方法(編集中)

  • ffmpeg
    • x11grabを使用
  • vlc
    • キャプチャーデバイスのデスクトップを使用、コマンドラインでならscreen://を指定

エンコーディング方法(動画)

PeerCastでの動画配信にはWMVやOgm(Ogv)、そして一応NSVがありますがここでは主にWMVについて述べます。
画面を取り込むソフトがWMVで動画を保存できない場合、WMVで配信するためには当然動画をWMV形式へ変更する必要があり、そのためにはffmpegが使えて、取り込むソフトで標準出力、名前付きパイプ(FIFO)*1出力ができるとリアルタイムでWMVへ変更できます。

PeerCastで動画を入力する方法

実際に配信する場合、当然ながら配信したいもの、ソースが無ければいけないわけですが、PeerCastにソースとして指定できるものにはファイルと他にhttpやmmsでのストリーミングなどがあります。ですので上記のffmpegなどでWMVへ変換した動画を名前付きパイプ(FIFO)へ出力させそのファイルをPeerCastのソースを指定するURLへfile:///home/hogehoge/peercast.wmvとでも入力してやればうまくいきます。うまくいけば、奇跡がおこれば。*2
万が一うまくいかない場合はhttpやmmsによって一度ストリーミングを行いそれをPeerCastのソースURLへ指定してやりましょう。

WMV動画をhttpやmmsでPeerCastへ渡す方法

PeerCastで配信をする前にhttpやmmsでストリーミング配信を行う必要がある場合、エンコードにffmpegを使用しているとffserverというのが使えます(詳細は検索でもしてください)。その方法ではうまくいかない、ffmpegを使っていないというときはVLC media playerのストリーミング機能が便利です、httpでもmmsでもストリーミングできるので。 そして実はVLC media playerはエンコーダとしての機能もあり、さらには画面の取り込みもできますから他に何も必要とせずWMVへ変換しながらストリーミング配信でPeerCastへ渡すことも可能です!なんと素晴らしい!…もちろんうまくいけばですが。

WMV動画をhttpやmmsでPeerCastへ渡す方法(自己責任Ver.)

上記の通り、ffmpegにはffserverというものがあり、ffserverによってhttpでストリーミングできます。しかし、その方法ではうまくいかない。使うであろう -vcodec wmv2 オプション さらに /hoge.asf という拡張子ではいくらコーデックがwmvでもpeercastにはasfと認識されてしまうからだ。しかしasfとwmvは実はあまり違いがない。公式ドキュメント*3にも書いてあるとおり、拡張子とMIMEの種類しか違わない。ならMIMEを偽造してpeercastにはWMVと認識してもらおうというのが今回の方法の趣旨である。 注意:よく読んで使用は自己責任!!!

  • 手順1. ffmpegは最新版を用意

    Ubuntuの場合、ここ*4を参考に。他は知らないけどとにかく最新。

  • 手順2. ソースを修正

    ffmpeg/ffserver.c

    ffmpeg/libavformat/asfenc.c を修正します。

    • ffmpeg/ffserver.c

   REDIR_RTSP,
   REDIR_SDP,
   REDIR_WMV, //add
};
     } else if (av_match_ext(filename, "sdp")) {
         redir_type = REDIR_SDP;
         compute_real_filename(filename, sizeof(filename) - 1);
     }
      else if (av_match_ext(filename, "wmv") && //add
        (!useragent || strncasecmp(useragent, "NSPlayer", 8) != 0)) { //add
        /* if this isn't WMP or lookalike, return the redirector file */ //add
        redir_type = REDIR_WMV; //add
     } //add
case REDIR_WMV: //add
  q += snprintf(q, c->buffer_size, //add
                "HTTP/1.0 200 WMV Redirect follows\r\n" //add
                "Content-type: video/x-ms-wmv\r\n" //add
                "\r\n" //add
                "[Reference]\r\n" //add
                "Ref1=http://%s/%s%s\r\n", hostbuf, filename, info); //add
break; //add
default:
  abort();
  break;
}
  • つづいてffmpeg/libavformat/asfenc.c
    • "vid-eo/x-ms-asf" の部分を "video/x-ms-wmv" に置換してください。 2箇所あるはずです。
  • 手順3. make
  • 手順4. ffserver.confの編集 とある配信者の一例
    Port 9000
    BindAddress 0.0.0.0
    MaxHTTPConnections 2000
    MaxClients 1000
    MaxBandwidth 1600
    CustomLog -
    NoDaemon
    <Feed feed1.ffm>
    File /tmp/feed1.ffm
    FileMaxSize 2000M
    </Feed>
    <Stream test.asf>
    Feed feed1.ffm
    Format asf
    VideoFrameRate 15
    VideoSize 800x640
    VideoBitRate 256
    VideoBufferSize 40
    VideoGopSize 30
    NoAudio
    VideoQmin 3
    VideoQMax 31
    </Stream>
    <Stream stat.html>
    Format status
    </Stream>
    <Redirect index.html>
    URL http://www.ffmpeg.org/
    </Redirect>
    いらない設定・いる設定あるはずですので各自慎重に!
  • 手順5. ffserver, ffmpegの起動 とある配信者の一例

    ffserver -f doc/ffserer.conf &
    ffmpeg -f x11grab -r 15 -s 800x640 -i :0.0 -vcodec wmv2 -b 256k -threads 2 -s 400x320 -async 100 -dts_delta_threshold 1 http://localhost:9000/feed1.ffm

  • 手順6. peercastへアドレスを渡す 上記のコマンドの例ではストリームURLのところに http://localhost:9000/test.wmvと入れる

補足:きちんとMIME偽装されているか確認する方法としてFirefoxのLive HTTP headersアドオンがあります。その他にも確認できる方法は山ほどあると思います。

ffmpegではなくPeerCastのソース(公式版の場合)を変更する方法も記述しておきます

  • 手順1. core/common/url.cppを編集

url.cpp内の

else if (stristr(arg,MIME_ASX))
	pls = new PlayList(PlayList::T_ASX, 1000);

という部分を

else if (stristr(arg,MIME_ASX))
	ch->info.srcProtocol = ChanInfo::SP_MMS; //pls = new PlayList(PlayList::T_ASX, 1000);

に変更

  • 手順2. make

以上。

具体的なコマンド例

ffmpeg -f alsa -i hw:0,0 -f x11grab -s 1280x1024 -r 20 -i :0.0 -f asf -acodec wmav2 -vcodec wmv2 peercast.wmv

ffmpeg -f oss -i /dev/dsp -f x11grab -s 1280x1024 -r 20 -i :0.0 -f asf -acodec wmav2 -vcodec wmv2 peercast.wmv

ffmpeg -f oss -i /dev/dsp -f x11grab -s 1280x1024 -r 20 -i :0.0 http://127.0.0.1:8090

ffmpeg -f oss -i /dev/dsp -f x11grab -s 1280x1024 -r 20 -i :0.0 -f asf -acodec wmav2 -vcodec wmv2 - | cvlc stream/asf:///dev/stdin --sout '#standard{access=http,mux=asf,dst=127.0.0.1:8080}'

ffmpeg -f oss -i /dev/dsp -f x11grab -s 1280x1024 -r 20 -i :0.0 -f asf -acodec wmav2 -vcodec wmv2 - | cvlc stream/asf:///dev/stdin --sout '#standard{access=mmsh,mux=asf,dst=127.0.0.1:1234}'

ffmpeg -f oss -i /dev/dsp -f x11grab -s 1280x1024 -r 20 -i :0.0 -f asf -acodec wmav2 -vcodec wmv2 - | cvlc stream/asf:///dev/stdin --sout '#standard{access=mmsh,mux=raw,dst=127.0.0.1:1234}'

recordmydesktop --on-the-fly-encoding -width 1280 -height 1024 -fps 20 -channels 2 -freq 44100 --overwrite -o tmp.ogv & ffmpeg -f ogg -i tmp.ogv -acodec wmav2 -vcodec wmv2 -shortest -f asf -y - | cvlc stream/asf:///dev/stdin --sout '#standard{access=mmsh,mux=raw,dst=127.0.0.1:1234}'

  • とあるlinux配信者の一例

    ffmpeg -f alsa -ac 2 -i hw:0,0 -f x11grab -s 800x600 -r 16/1.001 -i :0.0 -acodec wmav2 -ab 48k -ar 48000 -vcodec wmv2 -b 400k -s 640x480 -qmin 2 -qmax 31 -async 100 -dts_delta_threshold 1 -shortest -f asf -y - | vlc -I dummy stream/asf:///dev/stdin :file-caching=1000 --sout '#standard{access=mmsh,mux=asf,dst=127.0.0.1:8080}'

などなど。詳しいオプションなどは各自で調べて下さい。

雑記

ffmpegでの音声入力例

  • ALSA
    • ffmpeg -f alsa -i hw:0,0
  • Pulse
    • ffmpeg -f alsa -i pulse
  • JACK
    • ffmpeg -f jack -i ffmpeg

Linuxでの音事情

一筋縄ではいかないLinuxでの音の設定について.

mpdでBGMをかけてみる

arecordやffmpegからalsaを利用する場合には,
もちろん録音デバイス(マイク等)しか指定できません.

ステレオミキサがあれば良いのですが,ない場合にはBGMをかけられません.
ここではmpdを使ってBGMをかける方法を紹介します.
(この方法ではBGMのみで,マイク・ゲーム音は取りこめません.
複数の音声ソースがある場合には,下記のJACKを使う方法を推奨します.)

必要なソフト

  • mpd(Media Player Daemon): BGMをファイルに出力するために使用
  • ffmpeg: 画面をキャプチャし,mpdの音声とともにwmvにエンコード
  • vlc: localhostにストリーミングしてPeerCastに渡す

mpdの設定

outputのtypeにrecoderを指定します.
この他の設定は通常と同じなので省略します.

  • /etc/mpd.conf
    audio_output {
       type        "recorder"
       name        "My recorder"
       encoder     "vorbis"        # optional, vorbis or lame
       path        "/tmp/mpd.ogg"
       quality     "2.0"           # do not define if bitrate is defined
       format      "44100:16:1"
    }

配信設定

以下のコマンドで配信ができるのを確認しました.

ffmpeg -i /tmp/mpd.ogg -f x11grab -s 800x600 -r 5 -i :0.0 \
-acodec wmav2 -ab 48k -ar 44100 -ac 1 -vcodec wmv2 -b 500k -s 800x600 \
-f asf -y -loop_output 0 - \
| vlc -I dummy stream/asf:///dev/stdin :file-caching=2048 \
--sout '#standard{access=mmsh,mux=asf,dst=127.0.0.1:8080}

気づいたこと

  • マイクやゲーム音が入らないので微妙
  • 音声が途切れたりと安定しない・音質も微妙?
  • mpdにはhttpにストリーミングする機能があり,ffmpegからそれを参照することも可能ですが,その場合には曲の切れ目で配信が途切れてしまいました
  • loop_output 0が重要なようなそうでないような

下記のJACKを使う方法より良いところが見当たりません.
(mpdもjackでの出力をサポートしているので,jack経由で取り込んだほうが良いです.)
JACKを使う方法を推奨します.

JACKで色んな音をとりこんでみる

前述したmpdの場合はBGMのみしか配信にとりこめませんでした.
ここではJACKを使って複数の音をとりこむ方法を説明します.

JACKでできること

JACKでは,JACKに対応しているアプリケーション間で,
オーディオ(とMIDI)のルーティングを行うことができます.

"対応アプリケーション間"というのがちょっと曲者ですが,
メジャなソフトウェアはほとんどJACKに対応しています.
(例えばMplayer,Media Player Daemon,Audacityなど.詳細なリストは ここ を参照.)

重要なのは,ffmpegもJACKに対応していることで,
そこにオーディオプレイヤ・ゲーム・マイクなどの音を流し込める点です.

ffmpegからalsa経由でステレオミキサを指定すると,
配信が不安定になったりするので,そういう場合にもJACKは有効です.

JACKのインストール

JACKは複数のバックエンド上で動作しますが,
Linuxの場合にはalsaかPortAudio(それに実験段階らしいですがOSS)が必要になります.
alsa(or PortAudio)とともにJACKが標準でインストールされている環境が多いと思いますが,
ない場合にはパッケージ管理ツール等からインストールしておきます.
(以降のコマンド例はArchlinuxの場合.)

pacman -S jack alsa-plugins alsa-lib alsa-utils

パッケージで入手できるffmpegがjackに対応していない場合には,
gitからソースを入手してコンパイルする必要があります.
(x264等の他のライブラリが必要になりますが,不要なら無効にしても良いでしょう.)

git clone git://git.videolan.org/ffmpeg.git
cd ffmpeg; ./configure; make

JACKの操作はCUIで可能ですが,GUIから使いたい場合にはqjackctlを使うと良いかもしれません.

pacman -S qjackctl

JACKの設定

JACKでの出力に対応していないソフトの場合でも,
以下のように$HOME/.asoundrcに記述することで
alsaからJACKに音声を渡すことができます.

  • $HOME/.asoundrc
    pcm.pjack
    {
      type plug
      slave.pcm pcm.jack
    }
    pcm.jack
    {
      type jack
      playback_ports
      {
        0 alsa_pcm:playback_1
        1 alsa_pcm:playback_2
      }
      capture_ports
      {
        0 alsa_pcm:capture_1
        1 alsa_pcm:capture_2
      }
    }
    pcm.!default pcm.pjack

JACK自体はコマンドラインからだと,以下のように起動します.

jackd -r -dalsa -r44100 -p1024 -n2 -D -Chw:0 -Phw:0

オプションの詳細はmanを参照.
よく解らない場合にはqjackctlから起動すると良いかもしれません.

エンコード方法

以下のようにffmpegを起動します.

ffmpeg -ac 2 -f jack -i ffmpeg -f x11grab -s 800x600 -r 5 -i :0.0 \
-acodec wmav2 -ar 44100 -ab 48k -vcodec wmv2 -s 800x600 -b 500k \
-dts_delta_threshold 1 -loop_output 0 -y -f asf - \
| vlc -I dummy stream/asf:///dev/stdin \
--sout #standard{access=mmsh,mux=asf,dst=127.0.0.1:8080}

エンコーダを起動した後,qjackctlを起動してCONNECTのウィンドウを開きます.
右側のffmpegという出力先に,左側の任意の出力元を接続することで配信に音声を入れることができます.

TIPS

JACKではステレオミックスだけではなく,
もっと複雑に音声信号をルーティングすることができます.

例えば,以下のようなこともできます.

  • 複数の音声ソース -> ミキサ(JackMaster等) -> 各ソースに別個のエフェクト -> ffmpeg

他にも特定の自動でルーティングを行うようにもできます(jack.plumbing).

その他の強引な方法

ALSA、JACK、Pulseなどを使って音声をミックス後に出力し、そこからLine入力などに繋げその入力を録音。
その際の注意点としてはLine入力の出力はしないこと、欠点はマイクを使用していると音を聞く時に自分の声を聞くことになる(重要)、それとわずかに遅延が発生する可能性があること。

snd-aloopに手を出してみる

Linuxではドライバの関係上,サウンドカードにステレオミキサがついていても使えなかったり,
ソフトウェアでやろうにも猿ちぃのような簡単なソフトがなかったり,という問題があります.
(実際,上記のJACKを使えばステレオミキサ以上のことができますが,やや複雑です.)

そこでsnd-aloopというカーネルモジュールを使ってステレオミキサのように,
パソコンの音声出力を配信にのせる方法を紹介します.

snd-aloopとは

snd-aloopはNICのLoopbackと全く同じように,
パソコンの音声出力をそのまま音声入力につなげた仮想デバイスのことです.

上記の強引な方法で述べられているように,物理的につないでも同じ効果がありますが,
遅延やノイズの影響を考えるとsnd-aloopを使ったほうが有利かもしれません.

snd-aloopのインストール方法

(2.6.37以降?の)Linuxカーネルには含まれています.

$ modprobe -l | grep snd-aloop
kernel/sound/drivers/snd-aloop.ko.gz

上記のコマンドを実行して見当たらない場合は,
alsa-driverをalsa projectからとってきてビルドする必要があります.
(その際,kernerのヘッダファイルが必要になります.)

./configure --with-cards=aloop --with-kernel=/path/to/kernel-header
make
gzip drivers/snd-aloop.ko
cp drivers/snd-aloop.ko.gz /lib/modules/2.6.39-ARCH/kernel/sound/drivers/

※コピー先はディストリビューションによって異なります.

設定方法

su
modprobe snd-aloop

としてモジュールを読み込むと,以下のデバイスが作られます.

  • hw:Loopback,0
  • hw:Loopback,1

ここでhw:Loopback,1に出力すると,
音声がループバックされてhw:Loopback,0にそのまま入力として入ります.

  • $HOME/.asoundrc
    pcm.loopout {
            type hw
            card 1
            device 1
    }
    
    pcm.loopin {
            type hw
            card 1
            device 0
    }
    ※環境によってcard 0の部分は変わります.aplay -l等で確認してください.

上記のように.asoundrcに書いておけば,

aplay -D loopout test.wav | arecord -d 5 -f cd -D loopin rec.wav

とすることで再生した音をそのまま録音できます.

コンソールで配信してみる

underconstruction

  • Xなんていらなかった
  • atom(D525)でも配信できました
ffmpeg -f alsa -ac 2 -i loopin -f fbdev -i /dev/fb0 -r 2 -vf crop=800:600:0:0 -acodec wmav2 -ab 48k -vcodec wmv2 -b 500k -y ...

Linux環境でのPeerCast視聴方法

配信のチェックにも必要なので,載せて置きます.

必要なソフト

このほかにQtとMplayerが必要です.
Archlinuxの場合には以下のコマンドでインストールできます.
(他のディストリの場合には適宜読み替えてください.)

pacman -S qt mplayer

※これらのソフトではなくgnome-peercastやgpyp等を使っても視聴は可能です.
firefoxのアドオンにもyp viewerがあるようです.
参考: http://hibari.2ch.net/test/read.cgi/linux/1146192783/

ビルド手順

  • QPeerCastYP
    wget http://sourceforge.jp/projects/qpeercastyp/downloads/33223/qpeercastyp-0.4.0.tar.bz2
    tar xf qpeercastyp-0.4.0.tar.bz2
    cd qpeercastyp-0.4.0
    ./configure
    make
    sed -i 's/ページ/_page/g' build-linux/ui_advancedwidget.h
    make
    cd qpcplayer
    ./configure; make

※TerminalのLANGはUTF-8でないとsedが上手くいきません.
qpcplayerというmplayerのラッパがありますが,mplayer単体とそんなに変わらないかも.必要なければビルドしなくても良いです.

  • PeerCast Qt
    wget http://mosax.sakura.ne.jp/fswiki.cgi?action=ATTACH&page=PeerCast+Qt&file=peercast%2Dqt0014%2Etar%2Egz
    tar xf peercast-qt0014.tar.gz
    cd peercast/ui/linux
    make

GUIが必要な場合は以下のようにします.

cd peercast/ui/qt4
qmake; make

peercastを起動する際,PeerCast Qtに含まれている,
peercast/ui/htmlというディレクトリが必要になります.

インストールと設定

ビルドした以下のものをパスの通っている場所に置きます.
(make installでも構いません.その場合には/usr/local/binに入ります.)

  • qpeercastyp
  • qpcplayer
  • peercast
  • html(ディレクトリ)

後はqpeercastypを起動して,設定でpeercastのパス,
再生プレイヤ等の設定をすれば視聴できるようになります.
(ブラウザからのPeerCastの設定は,Windowsの場合とまったく同じです.)

生成される設定ファイルの一部を抜粋しておきます.

  • .config/QPeerCastYP/QPeerCastYP.conf
    [Player]
    SoundPlayer=/path/to/qpcplayer
    SoundPlayerArgs=\"$STREAM_URL(mmsh)\"
    SoundTypes=wma|ogg|mp3
    VideoPlayer=/path/to/qpcplayer
    VideoPlayerArgs=\"$STREAM_URL(mmsh)\"
    VideoTypes=wmv|ogm|nsv
    [Program]
    PCRawProxy=pcraw_proxy
    PeerCast=/path/to/peercast
    PeerCastArgs=
    UseCommonWebBrowser=false
    WebBrowser=/path/to/browser

*1 mkfifoなどで調べるといいかもしれません
*2 奇跡は起こしてこそ価値がある
*3 http://support.microsoft.com/kb/284094/ja
*4 http://ubuntuforums.org/showthread.php?t=786095

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-08-10 (月) 15:42:51 (591d)