Download and combine m3u *.ts to .mp4

Бывает такое: была запись в приватном канале (допустим семинар). Затем тебе же открывают доступ к прошедшему стриму (допустим это твое выступление). Хочется сохранить для истории для себя видео, но скачать никак не получится какими-то готовыми расширениями или сервисами (все под паролем + защита от дурака и вот это все…).

Недавно была похожая задача. Для себя хотел сохранить свое выступление. И так, что делаем, пошаговая инструкция.

Настраиваем wget

Если есть авторизация и проверка по рефереру, то стоит заранее настроить wget и передать заголовки. Если заголовков много, то самый простой способ это создать ~/.wgetrc файл и туда записать все нужные заголовки с куками и авторизацией. Например:

cat ~/.wgetrc
header = Accept: */*
header = Cache-Control: no-cache
header = Host: *****.ru
header = Origin: https://******.ru
header = Referer: http://*****.ru/some/path
header = Accept-Encoding: gzip, deflate
header = User-Agent: Mozilla/5.0(Intel MacOSX)AppleWebKit/537.36
...

Находим файл m3u

Далее открываем developer tools в браузере и ищем во вкладке сетевой активности файл .m3u

Открываете и видите там что-то похожее:

EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:6
#EXT-X-DISCONTINUITY
#EXTINF:6.000,
0.ts
#EXTINF:6.000,
1.ts
#EXTINF:6.000,
...
#EXTINF:6.000,
4315.ts
#EXTINF:1.805,
4316.ts

Собственно нужно получить последнее число, в моем примере это 4316.ts

Далее скачиваем все файлы .ts куда-нибудь в директорию:

URL="https://someurl/path/"
wget $URL'/'{0..4316}.ts

Если вдруг выдает ошибку что очень длинная строка аргумента, разбейте на несколько пачек ваш запрос:

wget $URL'/'{0..1315}.ts
wget $URL'/'{1316..2315}.ts
wget $URL'/'{2316..3315}.ts
wget $URL'/'{3316..4315}.ts

После того как вы скачали все файлы, вы получили кучу микро фильмов. Вам надо их как-то склеить. Самый простой способ склеить — это просто слить все в один файл:

echo {0..4315}.ts | tr " " "n" > tslist
echo -n '' > video.mp4
while read line
do
echo "cat $line >> video.mp4"
cat $line >> video.mp4
done < tslist

Это вариант очень простой, но есть но! Такой файл сможет прочитать, например, VLC Player, но не сможет QuickTime. Если нужно чтобы это был валидный mp4 формат, то переименовываем наш video.mp4 в video.ts и далее пропускаем его через ffmpeg:

mv video.mp4 video.ts
ffmpeg -i video.ts -acodec copy -vcodec copy video.mp4

И вот это уже нормальный валидный mp4 файл, который читается нормально видеоплеерами.

Если вы готовите видео для YouTube, то вы можете не перекодировать и загрузить сразу video.ts вариант — ютубчик сам все распарсит и сконвертирует.

Такой вот нехитрый способ скачать запись видео стрима и превратить его в mp4 файл.

Если вы знаете как улучшить этот пример, напишите, пожалуйста, в комментарии.

UPD

После прочтения мне предложили такой вариант:

ffmpeg -i "https://path/2/list.m3u" -c copy -bsf:a aac_adtstoasc "out.mp4"

FFMpeg вроде как умеет конвертировать списки m3u, но есть но для моей задачи. В моем случае файлы m3u и *.ts были не только под паролем, но и с защитой в виде проверки кук и реферера. Так что в моем варианте всеравно нужно было скачать сначала все файлы, а уже потом их конвертировать. Но если у вас есть прямой доступ, то можно так не заморачиваться и сделать все проще.