Arhn - архитектура программирования

Как скачать .m3u8 за один раз

У меня есть файл .m3u8 на удаленном хосте, содержащий фиксированные номера имени файла фрагмента .ts, а не поток:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.736,
media_0.ts
#EXTINF:9.96,
media_1.ts
#EXTINF:10.0,
media_2.ts
#EXTINF:10.0,
media_3.ts
#EXTINF:10.0,
media_4.ts
#EXTINF:10.2,
media_5.ts
#EXTINF:10.0,

Когда я использую эту команду:

# ffmpeg -i "http://example.com/chunklist.m3u8" file.mp4

frame=  582 fps=9.4 q=28.0 size=    1536kB time=00:00:23.21 bitrate= 542.1kbits/s dup=2 drop=4 speed=0.375x

Оно работает. Но получается покадровое видео и очень долго нужно. (Для воспроизведения видео требуется время.)

Но так как пути всех .ts файлов известны. (http://example.com/media_0.ts, http://example.com/media_1.ts, ...) Должен быть способ получить и объединить их все одновременно.

Но как в ffmpeg напрямую?!

РЕДАКТИРОВАТЬ (попробуйте решение):

Для одного решения я знаю, как объединить файлы с помощью ffmpeg.

ffmpeg -i "concat:0.ts|1.ts|2.ts|3.ts|4.ts|5.ts" -c copy output.mp4

Эта команда ffmpeg была отличной и работает менее чем за 1 секунду!

Итак, попробуйте загрузить все файлы .ts с помощью CURL с помощью этой команды:

curl \
http://example.com/media_0.ts -o 0.ts \
http://example.com/media_1.ts -o 1.ts \
http://example.com/media_2.ts -o 2.ts \
http://example.com/media_3.ts -o 3.ts \
http://example.com/media_4.ts -o 4.ts \
http://example.com/media_5.ts -o 5.ts

Но вы можете увидеть результат:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  687k  100  687k    0     0  75108      0  0:00:09  0:00:09 --:--:-- 74111
100  652k  100  652k    0     0  59404      0  0:00:11  0:00:11 --:--:-- 53400
100  673k  100  673k    0     0  48675      0  0:00:14  0:00:14 --:--:-- 55781
100  657k  100  657k    0     0  63573      0  0:00:10  0:00:10 --:--:-- 62494
100  671k  100  671k    0     0  39019      0  0:00:17  0:00:17 --:--:-- 40863
100  692k  100  692k    0     0  63480      0  0:00:11  0:00:11 --:--:-- 80049

Смотрите, общее время загрузки составило 72 секунды, а общая продолжительность всех частей 59 секунд! что на этот раз очень долго!

Извините, загрузите все части, а затем объедините это, это было не очень хорошим решением.

РЕДАКТИРОВАТЬ 2

Я пытаюсь получить другой файл .m3u8 на другом сервере с другим URL:

Загрузите и объедините вместе:

ffmpeg -i "concat:\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_0.ts|\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_1.ts|\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_2.ts|\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_3.ts|\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_4.ts|\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_5.ts\
" -c copy -y output.ts

Другая команда с файлом input.txt URL.

ffmpeg -f "concat" -i "input.txt" -c copy -y output.ts

файл input.txt:

file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_0.ts'
file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_1.ts'
file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_2.ts'
file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_3.ts'
file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_4.ts'
file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_5.ts'

Или эту команду некоторое время, если это необходимо:

ffmpeg -f "concat" -safe "0" -protocol_whitelist "file,http,https,tcp,tls" -i "input.txt" -c copy -y output.ts

Наконец, для того, чтобы скорость загрузки была хорошей, ВОЗМОЖНО, пропускная способность моего целевого сервера ограничена. :-(


  • Если вы контролируете серверную часть, как насчет того, чтобы вместо этого использовать zip-архив, а затем разархивировать после загрузки? 11.11.2017
  • @DaveS Это плохой поступок. 11.11.2017

Ответы:


1

Правильный способ объединения нескольких видеофайлов из плейлиста m3u8:

ffmpeg -i "http://example.com/chunklist.m3u8" -codec copy file.mp4


  • the m3u8 playlist can be on web or locally in directory
    • it contains list of file paths relative to the playlist
  • -codec copy чтобы избежать кодирования (что требует времени)
  • container type matters:
    • *.mp4 is fine but it seems little slow to mux when playlist is fetched from web
    • *.mkv или *.ts мне больше всего подошли
14.11.2018

2

можешь попробовать.

command: ffmpeg -y \ -v warning \ -loglevel debug \ -i "m3u8 url" \ -vcodec copy \ -c copy -f mpegts out.ts

конвертировать тс в мп4:

ffmpeg -i out.ts -acodec copy -vcodec copy out.mp4

20.12.2017

3

вот некоторый код Python, который делает это, вам просто нужно указать URL-адрес 1-го сегмента и количество сегментов (из файла .m3u8):

def dumpSegs(initUrl, n, path, append=False):
    """ downlaod and combine the .ts files
    given the first seg's url, the number of segments and
    the destination download path """
    with open(path, 'ab' if append else 'wb') as f:
        for i in range(1, n + 1):
            segurl = initUrl.replace('seg-1-', 'seg-{:d}-'.format(i))
            success = False
            while not success:
                try:
                    seg = requests.get(segurl, headers=HEADERS)
                    success = True
                except:
                    print('retrying...')
            f.write(seg.content)

Вот тот же код с еще несколькими наворотами

19.01.2018
  • Это второй пост только со ссылкой, рекламирующий тот же пакет. Это граничит с чрезмерной саморекламой. Вы можете прочитать о (как не быть спамером)[stackoverflow.com/help/promotion]. Вы предоставили сообществу SO несколько других хороших ответов, поэтому я не собираюсь отмечать это как спам, но это определенно ответ только по ссылке. Чтобы улучшить свой ответ и избежать удаления, я рекомендую вам включить в этот пост часть соответствующего кода. Ваш ответ должен стоять сам по себе без ссылки. Ссылка должна быть просто дополнительной. 19.01.2018
  • Хорошее редактирование. Просто убедитесь, что вы указали ссылку на ваш репозиторий. 19.01.2018
  • Вопрос касается файла m3u8, но ваш ответ предполагает, что все файлы ts в m3u8 строго следуют шаблону seg-1, может быть, по крайней мере, вам сначала нужно вручную извлечь все ссылки ts из m3u8. 22.12.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..