Actionscript 裡頭的 Sound 物件實在是相當方便,Sound 物件除了可以拿來播放外部的音訊檔案之外,也可以播放 MP3 Stram,所以其實在 Flash 裡頭,只要兩三行程式碼,就可以寫出一個 Shooutcast (或 icecast、live 365)網路廣播的播放介面。
用 Flash 寫 Shoutcast 的播放介面有什麼好處呢?雖然說這年頭什麼平台上都有可以播放 MP3 串流的軟體,Windows 上面有 Windows Media Player、有 WinAmp,麥金塔上面有 iTunes,是如果你用 Shoutcast 架了一個像是 Far 電台或是推推電台之類的服務,然後想找親朋好友來聽,但是你的親朋好友就是搞不清楚怎樣去下載 .pls 檔案,或是下載之後不知道要怎麼用,或是在媒體播放軟體裡頭就是不知道「開啟 URL」或「開啟位置」在那裡…那,直接給個網址用瀏覽器打開,還是比較輕鬆愉快些。熟悉瀏覽器使用的人,想來還是比較多吧?
打開 Flash,開一個新檔案,然後再第一個影格上面選「動作」,輸入以下程式碼,就可以寫出一個最簡單的 Flash 廣播了。
// 宣告 Sound 物件。
var Radio:Sound = new Sound();
// 載入電台,第一個參數代表的是音訊的所在 URL,假設 port 位在 8000,第二個參數代表是不是串流音訊。
Radio.loadSound("http://my.shoutcast.server.com:8000", true);
// 開始播放…。
Radio.start();
基本上就是這麼簡單啦。不過,既然說了「基本上」,嗯,那麼,這就代表說,還是會有所謂的…「實際上」。
你在 Flash 裡頭,如果按下 Ctrl + Enter 或 Cmd + Enter 測試影片,應該是沒有問題;但是,當你另外用 standalone 的 Flash Player 播放做出來的 swf 檔案,或是將 swf 放到網站上的時候,Flash Player 往往會告訴你,這個 swf 檔案要存取其他主機上的服務,而為了系統安全的關係,Flash Player 拒絕讀取這個不在同一台服務主機上的音訊,所以,或是詢問你是否要打開讀取其他主機檔案的權限,要不就是直接停止載入,什麼訊息也不給你。
這就很有趣:Flash 支援讀取 MP3 串流,但是又拒絕讀取不在同一台 web 主機上的音訊…這是怎樣,目前可以看到的狀況,通常是網路廣播與網頁不會在同一台機器上,而就算是同一台機器上同時有 web ,以及透過 http 傳輸的 MP3 串流服務,也是分別指定到不同的 port 上,但是 Flash 卻認為不在同一個 port,就是其他主機,也不讓你讀取。
在英文的相關網站上也看到有人討論這個問題,而某位仁兄的解法是,在 web 上面寫一個小小的 php 程式,透過 socket,把 Shoutcast 主機正在播放的音訊抓過來,然後再送給 Flash,這樣就可以讓網路音訊與 Flash 所在網頁,都在同一個網頁上了。怎麼看,這樣做都是多此一舉,而且會加重 web 主機的負擔與流量,但是目前測過這樣的確可行,而且一時之間也想不出還有什麼解法。
這段 PHP code 是這樣的:
假如我們將這段 PHP code 寫入一個叫做 player.php 的檔案中,然後,改一下前面的 Actionscript 的程式碼,把
Radio.loadSound("http://my.shoutcast.server.com:8000", true);
改成
Radio.loadSound("player.php", true);
最後將 swf 檔案與 player.php 放在 web 主機的同一個目錄就可以了。
寫一個小 Flash 來測試看看。以下這個小程式就可以播放 Far 電台的廣播,不過,Far 電台也不是無時不刻都是播出中,如果按下去沒有反應,就先檢查看看是否正在播出吧。
不過,這玩意兒感覺真的頂耗資源的啊…。
沒辦法吧,這都是server side push的。
我也用了一個,感覺會鈍鈍的 @@
hohoho好久沒至松柏兄這兒來叨饒
FLASH浪費系統資源的潛力是無窮的 在下曾做過ㄧ個無聊之至的射擊遊戲
只是不巧fps調到25 就
系統資源百分百!!!!
小的電腦 2G ram是也
不知道是不是因為真的很耗資源
我用了之後聽起來每隔3秒左右會跳針一下
如果用軟體直接聽就沒問題
這個方法的缺點是,Flash不會自己把不要的音樂部分丟棄,所以聽久了記憶體會爆掉 囧> 所以我們的電臺之後就都用最原始的EMBED播放器了。
Pingback: Return to Laughter » 網路電台重開
路過的留句話:
會跳針的,以下這行不要加。
fputs($sock, “Icy-MetaData:1\r\n”);
加上這行後,Shoutcast Server會把MetaData塞進MP3 data Stream當中。如果你沒有Pasring他們的話,這些資料就會造成跳針的情況。
您寫得很詳盡,感謝您的分享,請問如果需要抓取目前播放的音樂資訊,應該要如何處理?
用php socket re-direct OK!!
tested:
觸發我另外一個作法,直接在 apache 用 mod_proxy 轉遞 path
in mod_proxy.conf, tested OK!!
ProxyPass /radio-pr/ http://203.150.225.77:8100/
ProxyPassReverse /radio-pr/ http://203.150.225.77:8100/
Thanks for your sharing!! Nice Job.
btw, flash player 我用的是 open source mp3 player by
http://flash-mp3-player.net/players/js/
可以直接在頁面上用js控制 DOM。