2012/10/31

FFmpeg + WebM Live Streaming  FreeBSD

はまったのでメモ。

FreeBSD+ffserver+WebMでlive streamingをやりたかった。
しかしうまくいかず悩んだ。なぜかFLVではOKなのに。
で、こういうのを見つけた↓。

https://ffmpeg.org/trac/ffmpeg/ticket/684

つまり最新のバージョンじゃないとうまく行かないとのこと。
FreeBSDのportsからffmpegを入れると0.7.13(2012年10月30日現在)が入る。これは古いバージョンらしい。
で、portsにffmpeg1があるのでこれを入れてみたら、うまく行った。

設定は

ffserver.conf:

Port            8090
BindAddress     0.0.0.0
MaxClients      1000
MaxBandwidth    50000
CustomLog -
NoDaemon

<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 1M
#ACL allow 127.0.0.1
</Feed>

<Stream feed1.webm>
Feed feed1.ffm
Format webm
AudioCodec vorbis
AudioBitRate 64
VideoCodec libvpx
VideoSize 512x288
#VideoFrameRate 25
AVOptionVideo flags +global_header
AVOptionAudio flags +global_header
PreRoll 15
StartSendOnKey
#VideoBitRate 800
</Stream>

<Stream stat.html>
Format status
# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>

# Redirect index.html to the appropriate site
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>
サーバー側のコマンドは

# ffserver1 -f ffserver.conf

配信側のコマンドは(今回はwebmファイル)

$ ffmpeg1 -i XXX.webm http://localhost:8090/feed1.ffm

そしてついでにHTML5で動画を見るためのhtmlファイル。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>FFmepg-Streaming (WebM)</title>
</head>
<body>
  <center>
    <video controls>
      <source src="stream_multi.m3u8" type='video/mp4; codecs="avc.42E01E, mp4a.40.2"'
/>
      <source src="http://server:8090/feed1.webm" type='video/webm; codecs="vp8, vorbis
"' />
      Sorry, your browser does not support HTML5. 
    </video>
  </center>
</body>
</html>
まあこれで何とか見れました。(http://serverのserverは自分で置換してください)
最後はffmpeg使ってWebCamでのストリーミングだ。
0
タグ: FFmpeg ffserver WebM

2012/10/16

NginxをRTMPサーバーにしよう  FreeBSD

前回までC++ RTMP Serverで色々やってきのだが、これのライセンスって商用利用ダメだということで(http://www.rtmpd.com/licensing/参照)(更新2014/03/03 どうも商用OKになったようで、商用のサーバープログラムは別途に用意された模様)、NginxのRTMPサーバー用モジュールnginx-rtmp-moduleを試してみた。
もう一回確認した方がいいけど、どうもBSDライセンスらしい。うひょー、最高。

portsからのインストールは最初のconfig画面(あるいはmake config)でRTMPの奴を選択してインストール。

クリックすると元のサイズで表示します

画面の一番上のやつ。

/usr/local/etc/etc/nginx/nginx.confには
rtmp {
    server {
        listen 1935;
        application live {
            live on;
        }
    }
}
を書き加えればOK。ちなみにapplication nameはliveとなってる。
もっと詳しい設定はhttps://github.com/arut/nginx-rtmp-moduleを参照。

BSD License最高!

P.S.
worker_processesが1でない時はrtmp_auto_push on;にしなければならない模様。
例:
worker_processes 2;
rtmp_auto_push on;


と書いたけど、やっぱうまいこと行かないことがある。(ストリーム名をちゃんと指定しても再生できない)

作者さん曰く「帯域が2Gbps以下なら、worker_processesは1でOK」とのこと。
ソース↓
https://github.com/arut/nginx-rtmp-module/issues/91
0

2012/10/11

FlashでUSBカメラの画像をキャプチャーしよう  プログラミング

何か色々やってくうちに、Flashのプログラミングを始めてしまいました。 って言うか言語はActionScriptとか言うんやね。

で、初めてのActionScriptが↓。USBカメラから動画を拾ってしまおうというもの。Flashだとこんなに簡単にできるんやね。知らんかった。

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.media.Video;
    import flash.media.Camera;
    import flash.events.StatusEvent;
    
    public class Main extends Sprite 
    {
        private var vid:Video;
        private var cam:Camera;
        
        public function Main():void 
        {
            if (stage)
                init();
            else
                addEventListener(Event.ADDED_TO_STAGE, init);
            
            cam = Camera.getCamera();
            if (cam == null) {
                trace("Unable to locate available cameras."); 
            }
            else {
                trace("Found camera: " + cam.name); 
                cam.addEventListener(StatusEvent.STATUS, statusHandler);
            
                vid = new Video();
                vid.attachCamera(cam); 
            } 
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
        }
        
        private function statusHandler(event:StatusEvent):void { 
            if (cam.muted) { 
                trace("Unable to connect to active camera."); 
            } 
            else { 
                // Resize Video object to match camera settings and  
                // add the video to the display list. 
                vid.width = cam.width; 
                vid.height = cam.height; 
                addChild(vid); 
            } 

            // Remove the status event listener. 
            cam.removeEventListener(StatusEvent.STATUS, statusHandler); 
       }
    }
}

X11関係のプログラミングだと最後にmain loopを呼び出さないとダメだけど、これは勝手に呼び出されるのかね?
間違ってたらスマソ。
0
タグ: Flash ActionScript swf

2012/10/4

C++ RTMP Serverでライブストリーミングをやってみよう  FreeBSD

前回、C++ RTMP Server + FreeBSD 9.0によるYouTubeサーバーみたいな物を構築した。

さて今度はこれを使って、ライブストリーミングしてみよう。

本当はウェブカメラを使ってのライブストリーミングが理想的だが、その前段階として「動画をC++ RTMP Serverにリアルタイムで送信しつつ、それをウェブブラウザで見る」って方式でやってみた。

まずサーバー側のプログラムを走らせる。

# crtmpserver xxxxx.lua

出力ログでちゃんとポート6666をlistenしているか確認。

次に配信する動画のサーバーへのリアルタイム送信。

# ffmpeg -re -i test.flv -f flv -metadata streamName="test" tcp://crtmpserverマシン名:6666/

ここではtest.flvを"test"とストリーム名で送信している。

そしてウェブブラウザがアクセスするHTMLファイル内のJavaScriptのJW Playerの記述。
jwplayer("mediaplayer").setup({
flashplayer: "mediaplayer-5.10/player.swf",
image: "mediaplayer-5.10/preview.jpg",
controlbar: "bottom",
file: "test",
streamer: "rtmp://crtmpserverマシン名/flvplayback"
});
この中で

file: "test",

がみそではないかと思う。

これでtest.flvが見れるはず、というか見れた。
1

2012/10/3

C++ RTMP Server + JW Palyer 5.10 + FreeBSD 9.0  FreeBSD

C++ RTMP Serverを使ってYouTubeみたいに動画が見れるようにしよう!

まずcrtmpserverのインストール。portsからのインストールは

# cd /usr/ports/net/crtmpserver
# make install

だが、既にFreeBSD用のバイナリがhttp://www.rtmpd.com/downloads/にあるので、そこから拾ってくる方がいいかも。最新版だろうし。
そして設定。

# cd /usr/local/etc
# cp crtmpserver.lua.sample crtmpserver.lua
# vi crtmpserver.lua

description="FLV Playback Sample",
name="flvplayback",
protocol="dynamiclinklibrary",
mediaFolder="/home/crtmpserver/", <--ここに動画を置くディレクトリを書き加える
aliases=

次にApache 2.2のインストール。これは省略。設定としてDocumentRoot, Directoryを/home/crtmpserverにする。

JW Playerをhttp://www.longtailvideo.com/players/jw-flv-player/からダウンロード(zipファイル)し、/home/crtmpserver以下に解凍。
以下のようなコードを含んだHTMLファイルを書く(test.htmlとする)。

あ、このブログマジでちゃんとしたコードが載せられない…
なので下の画面の中のコードを見て下さい。
 
crtmpserverとapache22を走らせ

# crtmpserver /usr/local/etc/crtmpserver.lua
# /usr/local/etc/rc.d/apache22 start


http://サーバー名/mediaplayer-5.10/test.htmlにアクセスする。すると↓のような画面が現れ、YouTubeのように動画が再生できる。

クリックすると元のサイズで表示します
0
タグ: C++ crtmpserver JW



teacup.ブログ “AutoPage”
AutoPage最新お知らせ