Ако искам да гледам и записвам онлайн телевизии или други стриймове, често използвам инструмента rtmpdum. Много добър инструмент, но се използва в конзолен режим или през промпта на Windows. В тази статия ще покажа няколко примера, как използвам rtmpdump за да гледам и записвам български онлайн телевизии. Операционната система под която ще покажа примерите е LinuMint 18.1, която е Ubuntu базирана. Като исключим някои подробности по инсталацията, техниките са абсолютно същите и под Windows с тази разлика, че инструментите трябва да се намират в една директория.
Подготовка за дъмпване на онлайн видео стриймове
За начало е добре да инсталираме на flash-player за Ubuntu:
sudo apt-add-repository multiverse sudo apt-get update sudo apt-get install flashplugin-installer
След това инсталираме rtmpdump и някакъв лек видео плеър, който позволява подаване на команди през конзолата. Mplayer или VLC са доста добър избор, затова аз ще използвам mplayer:
sudo apt-get install rtmpdump sudo apt-get install mplayer
Да бучнем и един VLC плеър – ей така да има. Понякога с него картината е по-добре.
sudo apt-get install vlc
Създаваме една директория rtmpdump_tests в home-директорията и позиционираме конзолата в нея:
mkdir rtmpdump_tests cd rtmpdump_tests
Вече сме готови да стартираме нашите rtmpdump тестове, но преди това нека да видим какви са основните аргументи, които ще ползваме от хелпа на програмата:
rtmpdump -h --rtmp|-r url URL (e.g. rtmp://host[:port]/path) --playpath|-y path Overrides the playpath parsed from rtmp url --pageUrl|-p url Web URL of played programme --app|-a app Name of target app on server --swfVfy|-W url URL to player swf file, compute hash/size automatically --flashVer|-f string Flash version string (default: "LNX 10,0,32,18") --quiet|-q Suppresses all command output. --flv|-o string FLV output file name, if the file name is - print stream to stdout --debug|-z Debug level command output.
Мисля, че хелпа ясно показва кой аргумент за какво се ползва. Но най-добре да разгледаме няколко примера, които ще изяснят нагледно употребата им, но ще внеса малко пояснения:
-r – адреса на RTMP-сървара
-y – файла или името на стрийма, който плейва сървара
-p – адреса на WEB-страницата от която се излъчва видеото
-a – името на приложението, което плейва стрийма. Много често то е записано в адреса на rtmp-сървара. Примерно в rtmp://rd.xxxxdn.com:2016/fls, този аргумент е fls.
-W – това е флаш плеъра с контролите, който плейва стрийма. Обикновено това е swf-файл. Понякога в този файл се съдържа и парола за отключване на стрийма.
-f – флаш версията с която плейваме стрийма. Можем да използваме Windows (“WIN 18,0,0,232”) или Linux (“LNX 10,0,32,18”) версии.
-q – не е важна команда. Пропуска показването на допълнителната информация при изпълнение на командите. Използвам я, за да виждам по-бързо това, което ме интересува.
-o – записва стрийма в *.FLV файл, който в последствие можем да качим в Youtube или просто да си запазим някое тв-предаване във файл.
-z – много важна команда. Често показва какъв ни е проблема, когато някой стрийм не иска да се дъмпне.
Дъмпване на онлайн телевизия – пример 1
Аз не гледам много телевизия, но напоследък ми се случва да си пускам OnAir. Харесват ми репортажите, публицистиката и предаванията за култура и спорт.
Адреса за онлайн гледане на телевизията е: https://www.bgonair.bg/tvonline
Важно е да отбележим, че много често не е нужно да стартираме Wireshark, Fiddler или друга тежка бойна техника, за да дъмпнем някое поточно видео. Достатъчно да е поразгледаме сорс-кода на страницата, която излъчва видеото.
В случая ще прегледам сорс-кода и ще тестваме, дали параметрите в него са достатъчни. Ще използвам браузера Firefox. Отваряме сорса на https://www.bgonair.bg/tvonline , натискаме клавишната комбинация за търсене Ctrl+F и пишем rtmp.
Виждаме JavaScript код с параметри, които се подават на SWF-плеър, който стартира адрес някакво поточно RTMP-видео. Вероятно това е търсеното видео на OnAir. Раглеждайки този пасаж от сорс-кода на страницата, можем да изкараме следните параметри с които да стартираме rtmpdump:
-r rtmp://lb.cdn.bg:2006/fls -y bonair.stream?at=66981d3d13decfde7efc2e1fa19eb2b4 -W https://i.cdn.bg/flash/jwplayer510/player.swf -a fls/
Допълнително знаем и адреса на страница, която плейва видеото. Значи имаме и параметъра -p:
-p https://www.bgonair.bg/tvonline
Да направим първия тест с тези параметри, като задължително включим дебъгването, за да ни покаже, ако има някакъв проблем:
rtmpdump -r rtmp://lb.cdn.bg:2006/fls -y bonair.stream?at=66981d3d13decfde7efc2e1fa19eb2b4 -a fls/ -W https://i.cdn.bg/flash/jwplayer510/player.swf -p https://www.bgonair.bg/tvonline -z
Мда… Неуспешен първи опит, но пък ни донесе ценна информация за грешката. Да разгледаме какво изплю конзолата:
Интересният ред е този:
redirect, STRING: rtmp://edge12.cdn.bg:2006/fls>
Той ни покзва, че rtmp-адреса в страницата е с пренасочване към адрес rtmp://edge12.cdn.bg:2006/fls. Ок, тогава да направим нов опит с този нов адрес. Този път изпълнени с енстусиазъм и увереност, премахваме дебъгването и закачаме потока с пайп към mplayer. Важно е да се отбележи, че понякога mplayer иска предваретелен кеш на потока, или пък не иска. Това зависи и от хардуера в машината. Обикновено слагам кеширането, което препоръчват разработчиците и слагам опцията –, която казва на mplayer, че приема пайп поток, а не файл.
rtmpdump -r rtmp://edge12.cdn.bg:2006/fls -y bonair.stream?at=66981d3d13decfde7efc2e1fa19eb2b4 -a fls/ -W https://i.cdn.bg/flash/jwplayer510/player.swf -p https://www.bgonair.bg/tvonline | mplayer -cache 8192 -
В конзолата се вижда, че mplayer започва да кешира видеото. Трябва да изчакаме, докато кешира около 20%, след което се появява прозореца с видеото.
От опит знам, че много често повечето параметри не са необходими. Достатъчно е да знаем само rtmp-сървара и името на стрийма. Нека да пробваме, като разкараме и кеширането на mplayer.
rtmpdump -r rtmp://edge12.cdn.bg:2006/fls -y bonair.stream?at=66981d3d13decfde7efc2e1fa19eb2b4 | mplayer -
Плучи се една сравнително късичка команда. При мен работи, като има само едно леко забавяне в началото.
Ако искаме да запазим видеото във файл, тогава премахваме пайпа към mplayer и го заменяме с командата -o some_file.flv.
rtmpdump -r rtmp://edge12.cdn.bg:2006/fls -y bonair.stream?at=66981d3d13decfde7efc2e1fa19eb2b4 -o onair.flv
Видео, което показва стъпките в този пример:
Дъмпване на онлайн телевизия – пример 2
Предлагам да затвърдим материала, като дъмпнем още някоя телевизия. В този пример ще покажа как се дъмпва онлайн стрийма на BTV. Подхода е същият, дори може да се каже, че е още по-лесно. Отваряме страница с онлайн видеото: https://www.btv.bg/live/ и търсим в сорс-кода за стринг rtmp. Виждаме, че го има на няколко места, но нас ни интересува конкретно този пасаж:
Сега остава да сглобим командата за rtmpdump и да тестваме. Но ще използвам VLC-плеара, защото тоя mplayer нещо ме нерви с поведението си, множеството ръчни настройки и клавишни комбинации.
rtmpdump -r rtmp://hls.btv.bg.sof.cmestatic.com:80/alpha -y alpha | vlc -
И то взе, че тръгна! 🙂 Дори нямаше пренасочване.
Ако искаме да съхраним до файл, пак като по-горе, добавяме -o some_file.flv
Ето кратко видео и с упражнението – сваляне на онлайн видео от BTV с rtmpdump:
За следващото упражнение ще трябва да намеря нещо по-завързано.
Дъмпване на онлайн телевизия – пример 3
За този пример ще дъмпнем БНТ. Ще го направя под Windows, но тъй като знам, че стрийма от БНТ изисква токен (secure token – ключ за стартиране), за да се дъмпне, ще ни трябват някои допълнителни инструменти:
– Firefox – Web браузер. Избирате се езика и версията – 32 или 64bit.
– Firebug – добавка (addon) за Firefox, който ще ни помогне доста за разлистване на сорс кода на страницата.
– JPEXS Free Flash Decompiler – този безплатен инструмент декомпилира *.SWF файлове до изходния сорс-код.
– Notepad++ – текстов редактор, който може да търси в множество файлове.
Първа да разузнаем кои параметри можем да видим в сорс кода на страницата. Посещаваме с Firefox страницата на БНТ, която излъчва стрийма: https://tv.bnt.bg/bnt1/16×9/
Отваряме сорс кода и търсим за SWF. Оказва се, че няма такъв файл, значи е набутан в някой от JavaScript файловете и ще трябва по задълбочено ровичкане с Firebug.
Натискаме F12 за да заредим панела на Firebug. Избираме показалката за “Inspect element” и кликаме върху флаш прозореца с видеото.
След като се лисне сорса търсим в редовете JavaScript параметрите, които се подават на плеъра. Ето ги гадините:
До тук имаме следните параметри:
-r rtmp://lb.cdn.bg:2020/fls
-y bnt.stream?at=42516e922eacee82fb021dbc64b9165b
-a fls/
-W https://cdn.bg/eflash/jwplayer510/player.swf
-p https://tv.bnt.bg/bnt1/16×9/
Да направим първи тест, за да проверим, дали няма пренасочване или някакъв друг проблем:
rtmpdump -r rtmp://lb.cdn.bg:2020/fls -y bnt.stream?at=42516e922eacee82fb021dbc64b9165b -z
Резултата е:
DEBUG: Property: <Name: level, STRING: error> DEBUG: Property: <Name: code, STRING: NetConnection.Connect.Rejected> DEBUG: Property: <Name: description, STRING: Connection failed: Application rejected connection.> DEBUG: Property: <Name: ex, OBJECT> DEBUG: (object begin) DEBUG: Property: <Name: redirect, STRING: rtmp://edge11.cdn.bg:2020/fls>
Виждаме, че имаме пренасочване с redirect към rtmp://edge11.cdn.bg:2020/fls. Тогава да заменим адресите и да пробваме пак:
rtmpdump -r rtmp://edge11.cdn.bg:2020/fls -y bnt.stream?at=42516e922eacee82fb021dbc64b9165b -z
Този път се получи друга грешка:
DEBUG: Property: <Name: level, STRING: error> DEBUG: Property: <Name: code, STRING: NetConnection.Connect.Rejected> DEBUG: Property: <Name: description, STRING: Connection failed: Application rejected connection.> DEBUG: Property: <Name: clientid, NUMBER: 714507177.00> DEBUG: Property: <Name: secureToken, STRING: a8a4a8dcd4b74063e45148602dfebe8a4d24717532878cfaa2a1e87aaa0e58b48f0df073>
Появи се secureToken стринг, което означава, че видеото има нужда от този токен (ключ, парола), за да се стартира.
Как можем да разберем кой е този ключ и къде е този ключ. Понякога този токен се намира в HTML кода, друг път е набутан в SWF-файла. Има случаи при които видеото е защитено с двойка код + ключ. В един от следващите уроци ще покажа и случай, когато ключа е обфускейтнат и не се вижда никъде в явен вид, освен чрез хекс-редактор. В случая проверих и знам, че токена се намира в SWF-файла. За да го видим, първо трябва да декомпилираме SWF-файла до изходния му код. За тази цел сваляме swf-файла https://cdn.bg/eflash/jwplayer510/player.swf с някой даунлоадер или директно с браузера и го отваряме в програмата JPEXS Free Flash Decompiler.
Слектираме директорията със ActionScript-овете и я екстрактваме:
Сега отваряме програмата Notepad++ и избираме от менюто Search -> Find in files…, избираме директорията в която да рови, като оставяме за филтър “*” за да прерови всички файлове. Критерий за търсене ни е “securetoken”. Попадаме на тези ценни редове:
БИНГО – B@1R1st1077! Точно това е, което ни трябва!
Правим два-три опита с останалите параметри и виждаме, че тази команда стартира видеото:
rtmpdump -r rtmp://edge11.cdn.bg:2020/fls -y bnt.stream?at=42516e922eacee82fb021dbc64b9165b -p https://tv.bnt.bg/bnt1/16x9/ -T B@1R1st1077 | mplayer -
Ето и видеото, което показва как се дъмпва БНТ:
Следващия стрийм трябва да е още по усложнен. Може би трябва да покажа, как се разбират обфускейтнатите пароли, въпреки, че това не е много за начинаещи. Не е сложно, но не съм сигурен, дали е за масово споделяне. Може би ще дам подсказки за по-любознателните.
Дъмпване на онлайн телевизия – пример 4
[TODO]
Pingback: Simple BG TV Player - прост rtmpdump плеар за гледане на BG-телевизии | Блога на Нед
Pingback: rtmpdump на БНТ1 и БТВ и плейване с VLC | Блога на Нед
Здравей, би ли могъл да дадеш пример как може да се дъмпне и стрийма за бнт свят? Единственото, което можах да изкопча до момента е:
WiresharkÖ
GET /bnt1/fls/bntW.stream/playlist.m3u8?at=3b457b9e6f8930de33b5836cdd8463f0 HTTP/1.1
Host: e6-tc.cdn.bg
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://i.cdn.bg/live/ls4wHAbTmY
Origin: null
Connection: keep-alive
Изходна точка би било:
http://i.cdn.bg/live/ls4wHAbTmY
и
_sdata.src = ‘http://clb.cdn.bg/bnt1/fls/bntW.stream/playlist.m3u8?at=3b457b9e6f8930de33b5836cdd8463f0’;
благодаря Ти!
За BNT World пробвай така:
rtmpdump -r “rtmp://edge11.cdn.bg:2020/fls” -a “fls/” -p “http://i.cdn.bg/live/ls4wHAbTmY” -y “bntW.stream?at=42516e922eacee82fb021dbc64b9165b” –quiet | mplayer.exe –
Ето изход от командата под Линукс
bash-4.3$ rtmpdump -r “rtmp://edge2.cdn.bg:2020/fls” -a “fls/” -p “http://i.cdn.bg/live/ls4wHAbTmY” -y “bntW.stream?at=42516e922eacee82fb021dbc64b9165b” | mplayer –
RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: Unknown protocol!
WARNING: You haven’t specified an output file (-o filename), using stdout
Connecting …
INFO: Connected…
ERROR: rtmp server sent error
ERROR: rtmp server requested close
MPlayer 1.2.1-5.3.0 (C) 2000-2016 MPlayer Team
Playing –.
File not found: ‘–’
Failed to open –.
Exiting… (End of file)
За съжаление не зная каква е тази грешка. Иначе стрийма тръгва през уеб сайта.
Опс… Оправих горната команда. Бях допуснал грешка.
bash-4.3$ rtmpdump -r “rtmp://edge11.cdn.bg:2020/fls/” -a “fls” -p “http://i.cdn.bg/live/ls4wHAbTmY” -y “bntW.stream?at=42516e922eacee82fb021dbc64b9165b” –quiet | mplayer–
bash: mplayer–: командата не е открита
RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: You haven’t specified an output file (-o filename), using stdout
Connecting …
INFO: Connected…
Starting download at: -0.001 kB
INFO: Metadata:
INFO: duration 0.00
INFO: width 720.00
INFO: height 576.00
INFO: videodatarate 750.00
INFO: framerate 25.00
INFO: videocodecid 7.00
INFO: audiodatarate 125.00
INFO: audiosamplerate 48000.00
INFO: audiosamplesize 16.00
INFO: stereo TRUE
INFO: audiocodecid 10.00
INFO: encoder Lavf56.15.102
INFO: filesize 0.00
0.371 kB / 0.00 sec
Caught signal: 13, cleaning up, just a second…
ERROR: Download: Failed writing, exiting!
Много як инструмент лесно се работи с него. Би ли могъл да намериш и един пример как се работи с него, но под Android?
Здравей!
Много яко! Благодаря ти!
Но напоследък се получиха някои спънки – всички телевизии работят , но БНТ -тата не!
Тръгне донякъде и после повтаря последната фраза безброй пъти, докато не го затворя насилствено през таск мениджъра..
Предполагам че са взели мерки даден chunk от стрийма да няма връзка със следващия chunk и така оставя да повтаря последния….
Има ли начин да се оправи?
Здрасти, Нед, пак съм аз! Преди няколко дена пак се захванах с rtmpdump, но очевидно телевизиите пак променят нещо. Нова ТВ не работи, The Voice не работи, BG On Air не работи, а сега, вечерта гледам и БТВ не работи! Има ли някакъв начин да се разбере какво точно променят тия телевизии? Ще бъда много благодарен! Лека вечер!
Здравейте! А дали бихте могъл да дадете пример с “подкарването” на този линк : “http://live.bgtv.stream/bg.json”, под линукс. Благодаря Ви предварително!