Год назад увлёкшись просмотром фигурного катания, я начал изучать разные способы записывать трансляции. Далеко не все стримы сохраняются телеканалами, тем более - в исходном качестве, поэтому записывать нужно в реальном времени. Популярное решение для этого - запись screencast-а, скажем, в OBS Studio. Но это приводит к тормозам, пересжатию потока и появлению на видео индикатора загрузки, когда интернет лагает. Поэтому я начал искать пути работы с живыми потоками напрямую.
Примечание: я буду везде писать команды для линукса, то есть без расширения .exe, без учёта текущей рабочей папки и с использованием домашней папки
~/.
1. Streamlink
Streamlink - консольная программа для пенаправления потока из интернета в плеер или файл. Основной синтаксис такой:
Код:
# Открываем поток в наилучшем качестве (вместо best можно указать, скажем, 720p) в плеере по умолчанию:
streamlink youtu.be/RY_X-IarHJs best
# Открываем в другом плеере (mpv):
streamlink --player=mpv youtu.be/RY_X-IarHJs best
# Запись в файл:
streamlink -o ~/out.mp4 youtu.be/RY_X-IarHJs best
# Этот файл можно сразу открыть в плеере, и плеер будет нормально играть поток, записываемый streamlink-ом в реальном времени (проверял с тем же mpv).
# Читать стрим не с данной секунды, а с некоторого момента в прошлом:
streamlink --hls-live-edge 1337 youtu.be/RY_X-IarHJs best
# где мы перематываем назад на 1337 HLS-пакетов (по несолько секунд каждый).
Далеко не для каждого сайта Streamlink сможет сам догадаться, по какому адресу ему брать данные, поэтому часто нужно вручную искать плейлисты.
2. Ищем плейлисты (*.m3u8)
Метаданные о потоке хранятся в плейлисте *.m3u8 (это m3u в кодировке utf-8) Если мы найдём прямой URL этого плейлиста и передадим Стримлинку, мы сможем работать с ним даже без родной поддержки Стримлинком. Инструкцию пишу для Chrome/Chromium, но в Firefox, кажется, всё то же самое.
1. Открываем или перезагружаем страницу с трансляцией.
2. Выбираем интересующее нас качество, запускаем трансляцию.
3. Открываем Developer Tools (F12 в обоих браузерах).
4. Ищем на вкладке Elements. Ctrl+F, "m3u8", ищем что-то похожее на URL (
http://*****.m3u8). Не находим - идём дальше.
5. Ищем на вкладке Sources. Тут лучше кликнуть по трём точкам на левой панели и оключить Group by folder. Прокликиваем текстовые файлы, пытаемся интуитивно понять где может быть m3u8. Не находим - идём дальше.
6. Ищем на вкладке Network. Прокликиваем недавние запросы, в одном из них может быть заветный адресок.
Не находим - забиваем, идём пить пиво.
Примечание: на ok.ru стоит защита от идиота: в адресе плейлиста прописан IP и тип браузера, а при несовпадении с запросом - 403 Forbidden. С IP проблем не возникнет, но Стримлинку придётся прикинуться
бревном бразузером.
Ищем в инете "my user-agent", получаем нужную строчку, подсовываем её Стримлинку, чтобы он передавал её в заголовках HTTP-запросов:
Код:
streamlink --http-header User-Agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36" https://vsd15.mycdn.me/hls/373870299896.m3u8/sig/RkdzDR8P3AM/expires/1518410810168/srcIp/109.212.72.107/clientType/0/srcAg/CHROME/video.m3u8 best
3. Вертим потоками как хотим
С помощью плеера VLC можно смотреть потоки, писать их в файл, ретранслировать на ютуб или делать всё это одновременно. Это чуть менее надёжно, чем первый вариант (запись в файл и воспроизведение из того же файла), потому что стабильность потока зависит уже не только от Стримлинка, но и от VLC, но возможностей для работы гораздо больше. Меню VLC -> Media -> Stream... открывает визард, в котором можно задать параметры. С этим визардом я не очень подружился, но через 4 шага он предложит задать настройки одной строкой. Мне удалось сделать воспроизведение и ретрансляцию на ютуб со следующими настройками:
Код:
:sout=#transcode{vcodec=h264,scale=Auto}:duplicate{dst=std{access=rtmp,mux=ffmpeg{mux=flv},dst=rtmp://a.rtmp.youtube.com/live2/abcd-efgh-1234-5678},dst=display} :sout-keep
Где abcd-efgh-1234-5678 - это stream name/key, который нужно получить у себя на ютубе.
У меня слабый процессор, обработка идёт с тормозами, поэтому дальше в этом направлении я не копал.
4. Заключение
Нам осталось обрезать начало/конец и рекламу в середине видео. Резать нужно по ключевым кадрам, чтобы не пересжимать видео. Инструкций должно быть полно, в том числе и на Рутрекере. Лично я использую Avidemux, но товарищ
hereisit заявляет, что он иногда даёт щелчки в AAC, и что лучше использовать VideoReDo.
Итого, мы имеем запись стрима в наилучшем возможном качестве, без лагов и прочих глюков (Стримлинк достаточно устойчив к проблемам с сетью). Такой ручной способ позволяет не ждать милостей от
природы авторов софта, а хакать стримы самому.
Замечания, дополнения и критика всячески приветствуются.