Препарируем потоковое audio


Технологии потоковой передачи audio и video известны и в интернете используются достаточно давно. В связи с модой на использование Flash сейчас, наверное, на каждом третьем сайте есть swf'ки, иногда это player'ы для видеороликов и музыки. В качестве хрестоматийного примера можно привести YourTube, на котором swf player'ом прокручиваются как раз видео материалы.

Собственно меня это все мало занимает, потому что на сайты я обычно хожу за содержимым и добрую подовину времени использую текстовый elinks, но тут вот возникла необходимость укачать кое-что и по результатам исследований и наблюдений родилась эта заметка.

Сайт "старого радио" как-то давно уже был в bookmarks, там организовали раздачу старых радиопередач mp3 потоком через icecast. Интересно, здорово, вещь нужная, но не всегда ведь сидишь за компьютером, да и ежедневная передача целиком не нужна, а кромсать здоровенный mp3 и извлекать оттуда действительно интересные кусочки совсем тоскливо как-то.

(К слову про icecast, mplayer позволяет влегкую записать такой поток и при этом можно ограничить запись по времени, скажем записать только 40минут или 2 часа. Далее at и вопрос в принципе решен)

А не так давно на "старом радио" появилась возможность слушать передачи выборочно через такую вот флешку

swf от старого радио

Но в каждой бочке дёгтя есть ложка меда, реально пользоваться player'ом неудобно и часто просто невозможно по причине банальной кривости программистких рук. Дело в том, что написана эта поделка на коленке без понимания того ньюанса, что у многих людей интернет соединение так или иначе ограничено, может использоваться proxy server, какие-то порты могут быть закрыты, да мало ли чего еще. Вообще все, что в принципе не работает через стандартный http:// нежизнеспособно в силу вышесказанного. И так вот получается, что пока докопаешься до меда или в дегте весь будешь или на пчел налетишь.

Ага, оно видите ли хочет честного соединения с интернетом, а где ж его взять вот так сразу. Да и хочется, опять же, записать интересные передачи, ну нету в дороге online'а. Когда-то будет, наверное, а вот сейчас - нету! И что?

На письмо админам и создателям этого интересного (и это сказано абсолютно серьезно и без всякого стёба) сайта с просьбой укачать некоторые передачи получил, понятное дело, скатертью по жопе, типа "а много вас тут таких со свиным рылом халявным, мы то вот тут долгими зимними вечерами трудились, оцифровывали, не то, что некоторые...". Другая же отмазка насчет авторских прав тоже несостоятельна, при том что в сети варез лежит тоннами, раздать интересные передачи, имея желание не составляет никакого труда... Да и не думаю, что авторские права на записи, например, того же Сергея Есенина кому-то принадлежали в принципе, за давностью лет...

Ну да ладно, не будем жевать сопли, а перейдем к делу.

Раньше я никогда с Flash технологиями дела не имел, поэтому пришлось ознакомится с предметом поглубже. Первым делом после декомпиляции swf'ки (мои благодарности за помощь уходят frog'у) каталоге actions/ нашел сорцы, собственно сам движок для воспроизведения звука. Основная логика находится в файле sr_fla.MainTimeline.as. Язык программирования - не знаю какой, скачать и посмотреть документацию поленился, что-то жабообразное (или же Java as such), не суть, разобраться можно и без стакана.

При запуске флешке передается параметр, некий номер, по которому она лезет на сервер и скачивает XML с информацией о потоке:


function frame1()
        {
	 host = "195.91.207.197";
         if (1 || root.loaderInfo.parameters.mp3ID)
         {   
           mp3ID = root.loaderInfo.parameters.mp3ID;
           parmsXML = new XML();
           XML_URL = "http://" + host + "/getmp3parms.php?mp3id=" + mp3ID;
                myXMLURL = new URLRequest(XML_URL);
                myLoader = new URLLoader(myXMLURL);
         }
         ...

Вот пример одного такого XML:


<mp3>
<fname>Порудоминский В - В.И.Даль (инсценировка).mp3</fname>
<dir>disk2/большая коллекция</dir>
<length>3076</length>
<lowqualitydir>disk2/32 [skip]/</lowqualitydir>
</mp3>

После загрузки XML из него берется информация об URL, длительности etc:


public function xmlLoaded(param1:Event) : void
        {   
            var _loc_2:String;
            var _loc_3:String;
            parmsXML = XML(myLoader.data);
            _loc_2 = parmsXML.fname;
            _loc_2 = _loc_2.substring(0, _loc_2.length - 4);
            trackname_mc.trackname_txt.text = _loc_2;
            trackPath = _loc_2;
            lowqualitydir = parmsXML.lowqualitydir;
            qdir = lowqualitydir;
            initq();
            _loc_3 = parmsXML.dir;
            if (_loc_3 != "")
            {
                trackPath = _loc_3 + "/" + trackPath;
            }// end if

            duration = parmsXML.length;
            formatedDuration = formatTime(duration);
            time_txt.text = "00:00:00/" + formatedDuration;
            nc = new NetConnection();
            nc.objectEncoding = ObjectEncoding.AMF0;
            nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus);

Далее флешка коннектится к серверу:


            nc.connect("rtmp://" + host + "/vod");
            nc.client = this;
            return;
        }

В нашем случае получается такой URL:

rtmp://195.91.207.197/vod

И функция Play запрашивает с сервера audio поток:


public function Play()
        {   
            if (stopped)
            {   
                if (ns != null)
                {   
                    ns.close();
                }// end if
                ns = new NetStream(nc);
                ns.addEventListener(NetStatusEvent.NET_STATUS,
        netStreamStatus);
                if (pmc.x != 0)
                {   
                    ns.seek(pmc.x / positionRect.width * duration);
                }// end if
                ns.soundTransform = trans;
                ns.play("mp3:" + qdir + trackPath);
                beganPlaying = true;
                video.attachNetStream(ns);

С приведенным выше примером будет проигран файл:

mp3:disk2/32/Порудоминский В - В.И.Даль (инсценировка)
Кодировка русских букв - UTF-8, '.mp3' откушен после _loc_2.substring.

В принципе все просто как электровеник, очевидно, что такой код никогда не будет работать, если browser находится за proxy, кроме того, используется "фирменный" rtmp://, это закрытый адобовский протокол, который реботает через TCP/1935.

С этим rtmp:// справляется rtmpdump, для работы с НЕ ascii его нужно пропатчить.

Если под рукой есть винюки, то можно совместить полезное с приятным, а именно послушать и одновременно записать audio поток на диск.

Ставим Replay Media Catcher, который позволяет легко и просто записывать audio и video с rtmp и других протоколов.

Запускаем его, кликаем в browser'е на линк audio:

Replay Media Catcher Shot

Весь поток будет записан на диск, единственно, нужно будет переименовать его, для этого прямо в программе предусмотрена такая возможность.

Вот собственно и все, надеюсь, что кому-то пригодится эта информация.


Tags: linux audio flash


Назад



[Home] [TTL] [Unix] [Sdictionary] [ROW Programmer] [Symbian] [Misc] [News] [Search] [Contacts] [Guestbook]


Copyright (c) 1999-2017 Alexey Semenoff