您自己的網路廣播

我們許多人喜歡早上聽廣播。 然後一個晴朗的早晨,我意識到我不想聽當地的調頻廣播電台。 沒興趣。 但事實證明這個習慣是有害的。 我決定用網路接收器取代 FM 接收器。 我很快在速賣通上購買了零件並組裝了一個互聯網接收器。

關於網路接收器。 接收器的核心是 ESP32 微控制器。 來自 KA-radio 的韌體。 這些零件花了我 12 美元。 組裝的簡便性使我能夠在幾天內組裝它。 工作良好且穩定。 在 10 個月的工作中,它只凍結了幾次,而且只是因為我的實驗。 方便且經過深思熟慮的介面使您可以透過智慧型手機和電腦進行控制。 總之,這是一個很棒的網路接收器。

一切都好。 但有一天清晨,我得出的結論是,儘管可以訪問數以萬計的廣播電台,但沒有有趣的電台。 我對廣告和主持人的愚蠢笑話感到惱火。 不斷地從一個站跳到另一個站。 我喜歡 Spotify 和 Yandex.Music。 但可悲的是他們在我的國家不起作用。 我想透過網路接收器收聽他們的聲音。

我想起了我的童年。 我有一台錄音機和兩打磁帶。 我和朋友交換了磁帶。 這太棒了。 我決定只需要將音訊檔案傳送到網路接收器。 當然,您可以選擇將音訊播放器或 iPod 連接到揚聲器,無需擔心。 但這不是我們的方式! 我討厭連接器)

我開始尋找現成的解決方案。 市場上有一個來自 Radio-Tochka.com 的服務,可以創建您自己的網路廣播。 我測試了5天。 我的網路接收器一切正常。 但價格對我來說沒有吸引力。 我拒絕了這個選項。

我已付費託管 10 GB。 我決定編寫一個腳本來傳輸我的 mp3 檔案的音訊串流。 我決定用 PHP 寫它。 我很快就寫好了並啟動了它。 一切順利。 這很酷! 但幾天後我收到了主辦當局的信。 它表示超出了處理器分鐘數的限制,需要升級到更高的資費。 必須刪除該腳本並放棄此選項。

它是怎麼發生的? 沒有收音機我就活不下去。 如果他們不允許您在其他人的主機上運行腳本,那麼您需要自己的伺服器。 在那裡我會做我靈魂所渴望的事。

我有一台沒有電池的老式上網本(CPU - 900 MHz,RAM - 512 Mb)。 老人已經11歲了。 適合做伺服器。 我安裝的是 Ubuntu 12.04。 然後我安裝 Apache2 和 php 5.3、samba。 我的伺服器已經準備好了。

我決定嘗試 Icecast。 我讀了很多關於它的法力。 但我發現這很難。 我決定返回使用 PHP 腳本的選項。 我們花了幾天時間調試這個腳本。 一切都很好。 然後我還寫了一個播放播客的腳本。 我非常喜歡它,所以我決定做一個小專案。 稱之為 IWScast。 發佈在 github 上.

您自己的網路廣播

一切都很簡單。 我將 mp3 檔案和 index.php 檔案複製到 Apache 根資料夾 /var/www/ 中,它們會隨機播放。 大約 300 首歌曲大約足夠一整天。
index.php 檔案是腳本本身。 該腳本將目錄中的所有 MP3 檔案的名稱讀取到一個陣列中。 建立音訊串流並替換 MP3 檔案的名稱。 有時候你聽一首歌並且喜歡它。 你認為誰在唱歌? 對於這種情況,在日誌 log.txt 中記錄了已聽曲目的名稱
完整的腳本程式碼

<?php
set_time_limit(0);
header('Content-type: audio/mpeg');
header("Content-Transfer-Encoding: binary");
header("Pragma: no-cache");
header("icy-br: 128 ");
header("icy-name: your name");
header("icy-description: your description"); 
$files = glob("*.mp3");
shuffle($files); //Random on

for ($x=0; $x < count($files);) {
  $filePath =  $files[$x++];
  $bitrate = 128;
  $strContext=stream_context_create(
   array(
     'http'=>array(
       'method' =>'GET',
       'header' => 'Icy-MetaData: 1',
       'header' =>"Accept-language: enrn"
       )
     )
   );
//Save to log 
  $fl = $filePath; 
  $log = date('Y-m-d H:i:s') . ' Song - ' . $fl;
  file_put_contents('log.txt', $log . PHP_EOL, FILE_APPEND);
  $fpOrigin=fopen($filePath, 'rb', false, $strContext);
  while(!feof($fpOrigin)){
   $buffer=fread($fpOrigin, 4096);
   echo $buffer;
   flush();
 }
 fclose($fpOrigin);
}
?>

如果您需要按順序播放曲目,那麼您需要註解掉index.php中的行

shuffle($files); //Random on

對於播客,我使用/var/www/podcast/ 還有另一個腳本index.php。 它具有播客曲目記憶功能。 下次開啟網路接收器時,將播放下一個播客曲目。 還有播放曲目的日誌。
在 counter.dat 檔案中,您可以指定曲目編號,播客播放將從該曲目開始。

編寫用於自動下載播客的解析器。 它從 RSS 中獲取最新的 4 首曲目並下載它們。 所有這些都可以在智慧型手機、IPTV 機上盒或瀏覽器中完美運作。

有一天早上,我突然想到,記得曲目上的播放位置會很棒。 但我還不知道如何在 PHP 中做到這一點。

腳本可以下載 github.com/iwsys/IWScast

來源: www.habr.com

添加評論