- 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
關於 ffmpeg 的指令使用,虛擬裝置的安裝,ffserver 端的問題,已經寫在前些日子那。實際上這裡設定了兩個 stream,
- 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 弄出一個節目表的服務,它的功用在
- 接收 foobar2000 的 HTTP POST
- 將 HTTP POST 的資訊後處理,轉換成方便瀏覽器使用的 JSON string
- 推播到現存的 client
- https://github.com/Adios/muuun/blob/master/muuun.js
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,與修改後的版本
- https://github.com/Adios/circleplayer
將 CirclePlayer 的圈圈功能改成音量調整 - https://github.com/Adios/mu
整份網頁介面
這邊使用到的技術有 HTML5 Audio, Socket.io, CSS 3 WebFont。
整個系統之後可以朝向多人 hosters 的目標發展,也就是由聽眾決定,要不要繼續聽目前的曲子,還是要直接跳至 foobar2000 清單中的下一首。這個過程能經過投票決定。這部份會是 foobar2000 與 socket.io 的相關設計。
整個系統之後可以朝向多人 hosters 的目標發展,也就是由聽眾決定,要不要繼續聽目前的曲子,還是要直接跳至 foobar2000 清單中的下一首。這個過程能經過投票決定。這部份會是 foobar2000 與 socket.io 的相關設計。