用 Flash 播放 Shoutcast Stream

Actionscript 裡頭的 Sound 物件實在是相當方便,Sound 物件除了可以拿來播放外部的音訊檔案之外,也可以播放 MP3 Stram,所以其實在 Flash 裡頭,只要兩三行程式碼,就可以寫出一個 Shooutcast (或 icecastlive 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 電台也不是無時不刻都是播出中,如果按下去沒有反應,就先檢查看看是否正在播出吧。

不過,這玩意兒感覺真的頂耗資源的啊…。

9 thoughts on “用 Flash 播放 Shoutcast Stream

  1. hohoho好久沒至松柏兄這兒來叨饒
    FLASH浪費系統資源的潛力是無窮的 在下曾做過ㄧ個無聊之至的射擊遊戲
    只是不巧fps調到25 就
    系統資源百分百!!!!
    小的電腦 2G ram是也

  2. 這個方法的缺點是,Flash不會自己把不要的音樂部分丟棄,所以聽久了記憶體會爆掉 囧> 所以我們的電臺之後就都用最原始的EMBED播放器了。

  3. Pingback: Return to Laughter » 網路電台重開

  4. 路過的留句話:
    會跳針的,以下這行不要加。
    fputs($sock, “Icy-MetaData:1\r\n”);

    加上這行後,Shoutcast Server會把MetaData塞進MP3 data Stream當中。如果你沒有Pasring他們的話,這些資料就會造成跳針的情況。

  5. 用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。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.