rtmpdump tutorial – урок за начинаещи

Ако искам да гледам и записвам онлайн телевизии или други стриймове, често използвам инструмента rtmpdum. Много добър инструмент, но се използва в конзолен режим или през промпта на Windows. В тази статия ще покажа няколко примера, как използвам rtmpdump за да гледам и записвам български онлайн телевизии. Операционната система под която ще покажа примерите е LinuMint 18.1, която е Ubuntu базирана. Като исключим някои подробности по инсталацията, техниките са абсолютно същите и под Windows с тази разлика, че инструментите трябва да се намират в една директория.

Подготовка за дъмпване на онлайн видео стриймове

За начало е добре да инсталираме на flash-player за Ubuntu:

1
2
3
sudo apt-add-repository multiverse
sudo apt-get update
sudo apt-get install flashplugin-installer

След това инсталираме rtmpdump и някакъв лек видео плеър, който позволява подаване на команди през конзолата. Mplayer или VLC са доста добър избор, затова аз ще използвам mplayer:

1
2
sudo apt-get install rtmpdump
sudo apt-get install mplayer

Да бучнем и един VLC плеър – ей така да има. Понякога с него картината е по-добре.

1
sudo apt-get install vlc

Създаваме една директория rtmpdump_tests в home-директорията и позиционираме конзолата в нея:

1
2
mkdir rtmpdump_tests
cd rtmpdump_tests

Вече сме готови да стартираме нашите rtmpdump тестове, но преди това нека да видим какви са основните аргументи, които ще ползваме от хелпа на програмата:

1
2
3
4
5
6
7
8
9
10
11
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. Харесват ми репортажите, публицистиката и предаванията за култура и спорт.
Адреса за онлайн гледане на телевизията е: http://www.bgonair.bg/tvonline

Важно е да отбележим, че много често не е нужно да стартираме Wireshark, Fiddler или друга тежка бойна техника, за да дъмпнем някое поточно видео. Достатъчно да е поразгледаме сорс-кода на страницата, която излъчва видеото.

В случая ще прегледам сорс-кода и ще тестваме, дали параметрите в него са достатъчни. Ще използвам браузера Firefox. Отваряме сорса на http://www.bgonair.bg/tvonline , натискаме клавишната комбинация за търсене Ctrl+F и пишем rtmp.
Web page source - rtmp address
Виждаме JavaScript код с параметри, които се подават на SWF-плеър, който стартира адрес някакво поточно RTMP-видео. Вероятно това е търсеното видео на OnAir. Раглеждайки този пасаж от сорс-кода на страницата, можем да изкараме следните параметри с които да стартираме rtmpdump:

1
2
3
4
-r rtmp://lb.cdn.bg:2006/fls
-y bonair.stream?at=66981d3d13decfde7efc2e1fa19eb2b4
-W http://i.cdn.bg/flash/jwplayer510/player.swf
-a fls/

Допълнително знаем и адреса на страница, която плейва видеото. Значи имаме и параметъра -p:

1
-p http://www.bgonair.bg/tvonline

Да направим първия тест с тези параметри, като задължително включим дебъгването, за да ни покаже, ако има някакъв проблем:

rtmpdump -r rtmp://lb.cdn.bg:2006/fls -y bonair.stream?at=66981d3d13decfde7efc2e1fa19eb2b4 -a fls/ -W http://i.cdn.bg/flash/jwplayer510/player.swf -p http://www.bgonair.bg/tvonline -z

Мда… Неуспешен първи опит, но пък ни донесе ценна информация за грешката. Да разгледаме какво изплю конзолата:
rtmpdump - debug error
Интересният ред е този:

1
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 http://i.cdn.bg/flash/jwplayer510/player.swf -p http://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. Подхода е същият, дори може да се каже, че е още по-лесно. Отваряме страница с онлайн видеото: http://www.btv.bg/live/ и търсим в сорс-кода за стринг rtmp. Виждаме, че го има на няколко места, но нас ни интересува конкретно този пасаж:
BTV rtmpdump
Сега остава да сглобим командата за 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 страницата на БНТ, която излъчва стрийма: http://tv.bnt.bg/bnt1/16×9/
Отваряме сорс кода и търсим за SWF. Оказва се, че няма такъв файл, значи е набутан в някой от JavaScript файловете и ще трябва по задълбочено ровичкане с Firebug.
Натискаме F12 за да заредим панела на Firebug. Избираме показалката за “Inspect element” и кликаме върху флаш прозореца с видеото.
След като се лисне сорса търсим в редовете JavaScript параметрите, които се подават на плеъра. Ето ги гадините:
rtmp firebug parameters
До тук имаме следните параметри:
-r rtmp://lb.cdn.bg:2020/fls
-y bnt.stream?at=42516e922eacee82fb021dbc64b9165b
-a fls/
-W http://cdn.bg/eflash/jwplayer510/player.swf
-p http://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-файла http://cdn.bg/eflash/jwplayer510/player.swf с някой даунлоадер или директно с браузера и го отваряме в програмата JPEXS Free Flash Decompiler.
Слектираме директорията със ActionScript-овете и я екстрактваме:

ActionScript export

Сега отваряме програмата Notepad++ и избираме от менюто Search -> Find in files…, избираме директорията в която да рови, като оставяме за филтър “*” за да прерови всички файлове. Критерий за търсене ни е “securetoken”. Попадаме на тези ценни редове:
secureToken
БИНГО – B@1R1st1077! Точно това е, което ни трябва!
Правим два-три опита с останалите параметри и виждаме, че тази команда стартира видеото:

rtmpdump -r rtmp://edge11.cdn.bg:2020/fls -y bnt.stream?at=42516e922eacee82fb021dbc64b9165b -p http://tv.bnt.bg/bnt1/16x9/ -T B@1R1st1077 | mplayer -

Ето и видеото, което показва как се дъмпва БНТ:

Следващия стрийм трябва да е още по усложнен. Може би трябва да покажа, как се разбират обфускейтнатите пароли, въпреки, че това не е много за начинаещи. Не е сложно, но не съм сигурен, дали е за масово споделяне. Може би ще дам подсказки за по-любознателните.

Дъмпване на онлайн телевизия – пример 4

[TODO]

Немско-български и българо-немски речник за Windows, Android и Linux

Не знам, защо е толкова трудно да се намри безплатен немско-български офлайн речник. Търсих нещо читаво и не намерих. И за Android ситуацията е тъжна – безплатните речници, които ги има в GooglePlay са по-скоро рекламни платформи, а набора от думи е доста … семпъл. За това реших да си сглобя нещо с подръчни средства, което да интегрирам във вездесъщия GoldenDict.
Изтеглих два речника от Babylon:
German-Bulgarian
Bulgarian-German
Тези речници са малко криви и в тоя формат (BGL) е невъзможно да се редактират. Могат да се ползват в GoldenDict директно, но тъй като са компилирани в ANSI има досадни проблеми с умлаутите. За това ги прекомпилирах с Pyglossary – dictionary converter до обикновени текстови файлове, които мога да редактирам с регулярни изрази, за да се появят умлаутите. Промених енкодинга на файловете от ANSI до UTF-8 защото това е правилния енкодинг за юникод символите. След това прекомпилирах речниците до популярния StartDict-формат *.IFO, който се поддържа от повечето безплатни речникови платформи. Остана ми само да копирам речниците на съответните места.
Речниците с StarDict-формат могат да се изтеглят от тук: Bulgarian-German-Bulgarian_Dictionary.zip

Инсталиране на Немско-Български речник под Linux

Ще опиша процедурата за Ubuntu-базирани дистрибуции.
Първо ъпдейтваме хранилищата и изтегляме програмата GoldenDict:

1
2
sudo apt-get update
sudo apt-get install goldendict

Създаваме една папка dictdata в home-директорията в която да разархивираме речниците:

1
mkdir ~/dictdata

Изтегля се архива Bulgarian-German-Bulgarian_Dictionary.zip и се разархивира в папката dictdata.
След това отваряме програмата GoldenDict и правим следните настройки, за да заредим речниците:
Избираме от менюто Edit->Dictionaries, след това кликаме на бутона Add.. и браузваме до директорията с речниците – dictdata. След което натискаме бутона Rescan Now. Речниците вече са добавени. Ето как изглежда при мен:
GoldenDict - Българо-Немски речник

Инсталиране на Немско-Български речник под Windows

Изтегля се архива Bulgarian-German-Bulgarian_Dictionary.zip и се разархивира в някоя директория, примерно C:\dictdata.
Изтегля се програмата GoldenDict за Windows. Може да се изтегли портабъл версия или стандартен инсталатор. Инсталираме програмата след това правим настройките, за да посочим кои речници да ползва:
Редактиране->Речници…
Натискаме бутона Добавяне… и посочваме директорията в която сме разархивирали речниците:
GoldenDict - добавяне на речници
След което натискаме бутона Повторно сканиране и след това бутона Ok.
И вече си имаме речниците:
GoldenDict - Българо-Немски речник
Ако някой се затруднява с настройките на програмата, може да изтегли портабъл версия за Windows с добавени немско-български и английско-български речници от тук:
GoldenDict_Portable-EN-BG,DE-BG.rar
Предполагам, че само трябва да се разархивира и да се ползва.
GoldenDict разполага с много настройки, които са доста удобни – последователността на речниците може да се променя, могат да се добавят саунд-файлове с изговарянето на думите и т.н. Страхотна програма, а на всичкото отгоре напълно безплатна!

Инсталиране на Немско-Български речник под Android

GoldenDict има страхотна безплатна версия и за Android – GoldenDict Free. По-добър речник за телефон/таблет лично аз не съм срещал до сега. Само трябва да си качим немско-българските речници. За целта изтегляме архива Bulgarian-German-Bulgarian_Dictionary.zip. След това създаваме една папка dictdata в главната директория на устройството ни (телефона или таблета).
Android немско-български речник
Свързваме се с телефона/таблета по някакъв начин – с кабел или през WiFi. Аз ползвам ES File Explorer, който има една много полезна опция Network->Remote Manager и си работя през WiFi. Разархивираме архива с речниците в папката dictdata.
При стартиране на програмата тя сканира всички директории за речници. При мен автоматично намери речниците. Не се наложи да правя нищо допълнително. Ето немско-българския речник GoldenDict за Android в действие:
Android немско-български речник

Peppermint, wbar, lxde and language applet

Peppermint ми стана любимо Linux дистро за флашката. Изключително леко и бързо. Инсталирам го Universal USB Installer с персистентно пространство, за да мога да инсталирам допълнителни програми и да го конфигурирам. Ето малко тарикатлъци:
1. Добавяне на applet за смяна на английски и бълграски:

gedit ~/.linuxmint/skl

Поставям следния текст и Save:

setxkbmap "us,bg(phonetic)" -option "grp:alt_shift_toggle"

След това се стартира с:

~/.linuxmint/skl

И можете да си менкате кирилица или латиница с Shift+Alt (левите)
За улеснение може да се викне и аплета Keyboard layout switcher:
Десен клик на лентата със задачите -> Add/Remove Panel Items -> Panel Applets -> +Add -> Keyboard layout switcher

2. Добавяне на Wbar панел (като тоя в MAC)

apt-get install wbar

За улеснение при конфигурирането се изтегля WbarConf.
Инсталиране на WbarConf:

sudo ./install.sh /usr

И вече го имаме в Menu -> Accsessories -> WbarConf
Настройките за позицията и т.н. са в File -> Settings

3. Автоматично стартиране на програми със зареждането на Peppermint
Повечето съвременни Linux дистрибуции разполагат с улеснен Autostart на програмите. По принцип това може да се види и редактира в сесията на десктопа. Но ние сме пичове и обичаме да го правим сами. Ще покажа как могат да се набутат горните 2 “програми” в autostart-а на Peppermint.
Отивате в ~/.config/autostart и създавате празен файл keyb.desktop. Разширението .desktop казва на операционната система да зареди този файл при зареждането на десктопа за текущия потребител. Вътре в keyb.desktop поставяме следното съдържание:

[Desktop Entry]
Encoding=UTF-8
Name=Keyboard Layout
Comment=Keyboard Layout Settings
X-GNOME-Autostart-Delay=60
Exec=/home/peppermint/.linuxmint/skl

Същото можем да направим и с Wbar – wbar.desktop:

[Desktop Entry]
Encoding=UTF-8
Name=Wbar
Comment=Wbar panel
Exec=bash -c "sleep 10; /usr/bin/wbar -pos top --above-desk"

В крайна сметка, след рестарт, всичко си е на мястото и работи идеално:
wbar panel and wbar settings
Може би не е най-елегантното решение, но пък върши много добра работа.