FFmpeg и видео c Яндекс.Эфира

Потребовалось скачать с Яндекс.Эфира запись трансляции спектакля. Никто не гарантирует их сохранность, так что лучше сохранить самому. YouTube-DL ещё не умеет общаться с Эфиром, так что пришлось ковыряться самому.

Основная задача - достать видео с серверов Яндекса. В консоли разработчика в браузере оказалось, что: - плеер забирает видео кусками по четыре секунды, - все куски пронумерованы по-порядку, - важен ключ сессии, - есть куча неизвестных параметров, не дающая скачать фрагмент простым запросом по адресу.

Пока ковырялся с тем, как заставить Яндекс отдать фрагменты cURL'у, попытался достать их из кэша записи сессии в консоли разработчика в браузере. Уже и HAR-extractor нашел, собрал, протестировал, но одна засада - в кэше скапливается несколько гигов и браузер уже не хочет отдавать всё это богатство. Благо в Google Chrome оказалось есть возможность по клику на ресурс получить готовую комманду для cURL, так что все решилось просто:

for it in $(seq 308908800 308911500); do
    echo $it
    curl "https://ext-strm-level304.strm.yandex.net/kal/yavteatre/yavteatre0_169_1080p.json/seg-$it-v1-a1.ts?reqid=1544658984.60973.122101.3463&vsid=a6fa82078b7e447b9adcd0101ec8fdcea8e89b7c4ba7066bb0344a1353e0b1ae" -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: %your_user_agent%' -H 'DNT: 1' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7' -L --compressed -o ./segments/seg-$it-v1-a1.ts 
    sleep 1;
done;

На выходе получаем несколько тысяч .ts файлов, с которыми я уже работал в предыдущем выпуске. При неверном индексе фрагмента, запрос вернёт одно из dummy-видосов весом 1...4 Мб, которыми, например, оказались первые ~30 и последние ~800 из указанного в скрипте диапазона.

$ ffmpeg -f concat -safe 0 -i <(for f in ./segments/*.ts; do echo "file '$PWD/$f'"; done) -c:v libx264 -vf yadif -c:a aac output.mp4

<(for f in ./segments/*.ts; do echo "file '$PWD/$f'"; done) - собирает список сегментов
-c:v libx264 - видео-кодек
-vf yadif - убираем interlacing
-c:a aac - аудио-кодек

Оба процесса работают на скорости порядка 1.2х, так что дело это не быстрое. Хотя, если задать жесткий список файлов для ffmpeg, то можно запустить в паралелли с небольшим отставанием.

Comments.

All posts:

FFmpeg: заменяем аудиодорожку
FFmpeg и видео для Twitter
FFmpeg: собираем gif
ffmpeg: выбираем дорожки
FFmpeg: разрезаем видео на равные куски
Никогда не сдавайся
Облысение Земли
Моральные дилеммы
Воздушные замки в вакууме
МКЖД и Лосиный остров
Группы крови
Обновился до Android 7
ЕГАИС в действии
Pokemon GoGo
Pokemon GO
Кот-пиздец
Привез из Питера
Ветеринарное приключение
Мосэнергосбыт жжот
Мощность ноута
Коленный ортез
О кулере и Thinkfan
Раковый скрининг
Доставка орехов
Белковое чудо
Poop diary
Папад
Оптимистичный дождь
СДЭК и vse-noski.ru