๋‚˜๋งŒ์˜ ์ธํ„ฐ๋„ท ๋ผ๋””์˜ค

์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์•„์นจ์— ๋ผ๋””์˜ค๋ฅผ ๋“ฃ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋˜ ์–ด๋Š ํ™”์ฐฝํ•œ ์•„์นจ, ๋‚˜๋Š” ์ง€์—ญ FM ๋ผ๋””์˜ค ๋ฐฉ์†ก์„ ๋“ฃ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์Šต๊ด€์€ ํ•ด๋กœ์šด ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  FM ์ˆ˜์‹ ๊ธฐ๋ฅผ ์ธํ„ฐ๋„ท ์ˆ˜์‹ ๊ธฐ๋กœ ๊ต์ฒดํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ ์†ํ•˜๊ฒŒ Aliexpress์—์„œ ๋ถ€ํ’ˆ์„ ๊ตฌ์ž…ํ•˜๊ณ  ์ธํ„ฐ๋„ท ์ˆ˜์‹ ๊ธฐ๋ฅผ ์กฐ๋ฆฝํ–ˆ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐ๋„ท ์ˆ˜์‹ ๊ธฐ์— ๋Œ€ํ•˜์—ฌ. ์ˆ˜์‹ ๊ธฐ์˜ ํ•ต์‹ฌ์€ ESP32 ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค. KA-radio์˜ ํŽŒ์›จ์–ด. ๋ถ€ํ’ˆ๊ฐ’์€ 12๋‹ฌ๋Ÿฌ์˜€์Šต๋‹ˆ๋‹ค. ์กฐ๋ฆฝ์ด ๊ฐ„ํŽธํ•ด์„œ ๋ฉฐ์น ๋งŒ์— ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. 10๊ฐœ์›” ๋™์•ˆ ์ž‘์—…ํ•œ ๋™์•ˆ ๋ช‡ ๋ฒˆ๋งŒ ๋ฉˆ์ท„๋Š”๋ฐ ๊ทธ ๋‹ค์Œ์—๋Š” ๋‚ด ์‹คํ—˜ ๋•Œ๋ฌธ์— ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค. ํŽธ๋ฆฌํ•˜๊ณ  ์„ธ์‹ฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์Šค๋งˆํŠธํฐ๊ณผ ์ปดํ“จํ„ฐ์—์„œ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ๋งˆ๋””๋กœ ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ์ธํ„ฐ๋„ท ์ˆ˜์‹ ๊ธฐ์ž…๋‹ˆ๋‹ค.

๋‹ค ๊ดœ์ฐฎ์•„. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋Š ์ด๋ฅธ ์•„์นจ ๋‚˜๋Š” ์ˆ˜๋งŒ ๊ฐœ์˜ ๋ผ๋””์˜ค ๋ฐฉ์†ก๊ตญ์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด ๋ฐฉ์†ก๊ตญ์ด ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฐœํ‘œ์ž๋“ค์˜ ๊ด‘๊ณ ์™€ ์–ด๋ฆฌ์„์€ ๋†๋‹ด์— ์งœ์ฆ์ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ•œ ์Šคํ…Œ์ด์…˜์—์„œ ๋‹ค๋ฅธ ์Šคํ…Œ์ด์…˜์œผ๋กœ ๋Š์ž„์—†์ด ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” Spotify์™€ Yandex.Music์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„์‰ฌ์šด ์ ์€ ์šฐ๋ฆฌ๋‚˜๋ผ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธํ„ฐ๋„ท ์ˆ˜์‹ ๊ธฐ๋ฅผ ํ†ตํ•ด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์–ด๋ฆฐ ์‹œ์ ˆ์„ ๊ธฐ์–ตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ…Œ์ดํ”„ ๋ ˆ์ฝ”๋”์™€ XNUMX๊ฐœ์˜ ์นด์„ธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์นœ๊ตฌ๋“ค๊ณผ ์นด์„ธํŠธ๋ฅผ ๊ตํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํ›Œ๋ฅญํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ์˜ค๋””์˜ค ์•„์นด์ด๋ธŒ๋ฅผ ์ธํ„ฐ๋„ท ์ˆ˜์‹ ๊ธฐ๋กœ๋งŒ ์ŠคํŠธ๋ฆฌ๋ฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์˜ค๋””์˜ค ํ”Œ๋ ˆ์ด์–ด๋‚˜ iPod์„ ์Šคํ”ผ์ปค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค! ๋‚˜๋Š” ์ปค๋„ฅํ„ฐ ์—ฐ๊ฒฐ์„ ์‹ซ์–ดํ•œ๋‹ค)

๋‚˜๋Š” ๊ธฐ์„ฑ ์†”๋ฃจ์…˜์„ ์ฐพ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. Radio-Tochka.com์—์„œ ์ž์‹ ๋งŒ์˜ ์ธํ„ฐ๋„ท ๋ผ๋””์˜ค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ œ์•ˆ์ด ์‹œ์žฅ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. 5์ผ ๋™์•ˆ ํ…Œ์ŠคํŠธํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๋‚ด ์ธํ„ฐ๋„ท ์ˆ˜์‹ ๊ธฐ์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€๊ฒฉ์€ ๋‚˜์—๊ฒŒ ๋งค๋ ฅ์ ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ์˜ต์…˜์„ ๊ฑฐ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜ธ์ŠคํŒ… 10GB๋ฅผ ์ง€๋ถˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” mp3 ํŒŒ์ผ์˜ ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆผ์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” PHP๋กœ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋นจ๋ฆฌ ์ž‘์„ฑํ•˜๊ณ  ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ‹์กŒ์–ด! ๊ทธ๋Ÿฐ๋ฐ ๋ฉฐ์น  ํ›„ ํ˜ธ์ŠคํŒ… ๊ด€๋ฆฌ๊ตญ์œผ๋กœ๋ถ€ํ„ฐ ํŽธ์ง€๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ ์‹œ๊ฐ„ ์ œํ•œ์ด ์ดˆ๊ณผ๋˜์—ˆ์œผ๋ฉฐ ๋” ๋†’์€ ๊ด€์„ธ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ–ˆ๊ณ  ์ด ์˜ต์…˜์€ ํฌ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ์ด ์ผ์ด ์ผ์–ด ๋‚ฌ์–ด์š”? ๋ผ๋””์˜ค ์—†์ด๋Š” ๋ชป ์‚ด์•„์š”. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ˜ธ์ŠคํŒ…์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ž์ฒด ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์˜ํ˜ผ์ด ์›ํ•˜๋Š” ๊ฒƒ์„ ๋‚ด๊ฐ€ ํ•  ๊ณณ.

์ €๋Š” ๋ฐฐํ„ฐ๋ฆฌ๊ฐ€ ์—†๋Š” ์˜ค๋ž˜๋œ ๋„ท๋ถ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(CPU - 900MHz, RAM - 512Mb). ๊ทธ ๋…ธ์ธ์€ ๋ฒŒ์จ 11์‚ด์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ถ„ํˆฌ 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

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€