zonble’s promptbook

2006 年 12 月 1 日

我的電腦 用 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
// 網路廣播主機位置
// 其實這段如果改成外部傳進來的變數,還可以寫成廣播選台器…
$streamname = "my.shoutcast.server.com";
// 網路廣播主機提供服務的 port
$port = "8000";
// 網路廣播所在路徑,如果是 shoutcast,就直接位在根目錄「/」
$path = "/";

header("Content-type: audio/mpeg");
$sock = fsockopen($streamname,$port);

fputs($sock, "GET $path HTTP/1.0\r\n");
fputs($sock, "Host: $streamname\r\n");
fputs($sock, "User-Agent: WinampMPEG/2.8\r\n");
fputs($sock, "Accept: */*\r\n");
fputs($sock, "Icy-MetaData:1\r\n");
fputs($sock, "Connection: close\r\n\r\n");

fpassthru($sock);
fclose($sock);
?>

假如我們將這段 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 電台也不是無時不刻都是播出中,如果按下去沒有反應,就先檢查看看是否正在播出吧。

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

文章分類: — zonble @ 2:22 am #

7 項留言回應 »

  1. 沒辦法吧,這都是server side push的。

    來自 tacchang 的 迴響留言 — 2006 年 12 月 3 日 @ 12:51 pm

  2. 我也用了一個,感覺會鈍鈍的 @@

    來自 MLChen 的 迴響留言 — 2006 年 12 月 6 日 @ 1:06 pm

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

    來自 sandman 的 迴響留言 — 2007 年 1 月 8 日 @ 6:33 pm

  4. 不知道是不是因為真的很耗資源
    我用了之後聽起來每隔3秒左右會跳針一下

    如果用軟體直接聽就沒問題

    來自 mdfh 的 迴響留言 — 2007 年 2 月 8 日 @ 12:21 am

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

    來自 Cassatte 的 迴響留言 — 2007 年 2 月 27 日 @ 2:25 pm

  6. [...] 這回從Zonble處學習如何利用flash 來自動打開shoutcast 文件,不過我的flash 軟體使用,完全沒有到位,連個簡單的圖片效果都做不出來,還是按照原先抄來的使用說明來收聽吧,今晚浪費時間做這件事,是標準的玩物喪志,另外還翻了十分鐘左右的「利瑪竇的記憶之宮」,舛想著史景遷到底要告訴我們什麼,不明白於是放棄,眼睛好痛。 [...]

    來自 Return to Laughter » 網路電台重開 的 Pingback — 2007 年 4 月 21 日 @ 11:41 pm

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

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

    來自 路過的.... 的 迴響留言 — 2007 年 5 月 14 日 @ 6:36 pm

留言回應

XHTML: 您可以使用的 HTML 語法如下: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Powered by WordPress 2.6.2, Yichi.org,
ideas and cares
.

Weizhong Yang(a.k.a zonble)
Email:zonble@gmail.com
AIM: zonble@man.com