8.16.2012

Build A Live Audio Streaming System

這是一個手工打造串流音樂台的記錄,source 是以 ffmpeg 擷取 foobar2000 的音源,轉檔並傳送到 server 那邊的 ffserver,
  • source: Intel Core 2 Duo E6850, 8GB ram, Windows 7 64bit.
  • server: Intel Atom D510, 4GB ram, FreeBSD 9.0 amd64.
Server 端只負責對外的服務,不需要特別強悍的效能。
這個串流系統總共用到這些東西,
  • ffmpeg:@source,擷取音源
  • foobar2000:@source,播音樂,並且將現在播放的資訊丟到遠方的節目表 service
  • ffserver :@server,接收 ffmpeg 來源,並提供對外的 streaming
  • socket.io:@server,接收 foobar2000 現在播放的資訊,推播到網頁上
  • nginx :@web,網頁介面
  • jPlayer:@web,HTML5 audio library

ffmpeg & ffserver


  • ogg in webm, 192kb for Firefox, Chrome.
  • mp3, 256kb for Chrome, Internet Explorer, Safari.

<stream mu.webm="mu.webm">
Feed mu.ffm
Format webm
AudioCodec libvorbis
AVOptionAudio flags +global_header
AudioBitRate 192
AudioChannels 2
AudioSampleRate 44100
NoVideo
</stream>

<stream mu.mp3="mu.mp3">
Feed mu.ffm
Format mp3
AudioCodec libmp3lame
AVOptionAudio flags +global_header
AudioBitRate 256
AudioChannels 2
AudioSampleRate 44100
NoVideo
</stream>

只要這邊設定好了,就已經能用常用的 player 打開 URL 聽串流。

foobar2000


因為是採用 ffmpeg 直接擷取整台電腦的音源,沒辦法直接將 foobar2000 的 meta informations 串流在一起,meta informations 必須另外自己處理,所以 foobar2000 這邊除了播音樂,還要負責將現在播放的資訊丟到遠方的節目表服務,這邊是以 foobar SDK 弄了一個 
它能將現在播放的資訊以 HTTP POST 傳到設定頁中指定的 URL,傳送的動作會在「歌曲變更」時觸發。

socket.io


socket.io 是 node 上非常方便的 Web Socket implementation,對於支援的的 browser,會直接以 WebSocket 溝通,否則會降回到傳統的幾個 long-pulling 機制。這邊以 node 與 socket.io 弄出一個節目表的服務,它的功用在

nginx


一者是想讓對外的服務介面一致,一者是 node 不花心思寫的話,serving static files 效能不彰。這裡實際上我讓 foobar2000 的 HTTP POST 與 browser client 的推播導向跑在 localhost 的節目表 service。

    server {
        server_name mu.adios.tw;

        location / {
            root        /home/www/adios.tw/mu;
            index       mu.html;
            try_files   $uri $uri/ @home;
        }
        location ~ /\.git {
            deny        all;
        }
        location ~ ^/foo {
            proxy_pass  http://127.0.0.1:2000;
        }
        location ~ ^/muuun {
            proxy_http_version  1.1;
            proxy_pass          http://127.0.0.1:2000;
        }
        location @home {
            proxy_pass  http://127.0.0.1;
        }
    }

網頁介面


網頁介面包括使用了現成的 jPlayer & CirclePlayer,與修改後的版本
這邊使用到的技術有 HTML5 Audio, Socket.io, CSS 3 WebFont

整個系統之後可以朝向多人 hosters 的目標發展,也就是由聽眾決定,要不要繼續聽目前的曲子,還是要直接跳至 foobar2000 清單中的下一首。這個過程能經過投票決定。這部份會是 foobar2000 與 socket.io 的相關設計。



沒有留言: