web-dev-qa-db-fra.com

Comment télécharger .m3u8 en une seule fois

J'ai un .m3u8 fichier sur l'hôte distant, contenant des nombres fixes de morceaux .ts nom de fichier et non flux:

#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,

Lorsque j'utilise cette commande:

# 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

Ça marche. Mais il obtient une vidéo image par image et un temps très long nécessaire. (Il faut presque du temps pour lire la vidéo.)

Mais depuis le chemin de tous les .ts les fichiers sont connus. ( http://example.com/media_0.ts , http://example.com/media_1.ts , ...) Il doit y avoir un moyen d'obtenir et les fusionner tous en même temps.

Mais comment en ffmpeg directement?!

EDIT (essayez une solution):

Pour une solution, je sais comment concaténer des fichiers avec ffmpeg.

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

Cette commande ffmpeg était géniale et fonctionne en moins de 1 seconde!

Essayez donc de télécharger tous les .ts fichiers avec CURL avec cette commande:

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

Mais vous pouvez voir le résultat:

  % 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

Vous voyez, le temps de téléchargement total était de 72 secondes, tandis que la durée totale de toutes les parties est de 59 secondes! que ce temps est très long!

Alors désolé, téléchargez toutes les pièces et concattez cela, ce n'était pas une bonne solution.

EDIT 2

J'essaye pour un autre .m3u8 fichier sur un autre serveur avec une URL différente:

Téléchargez et concattez ensemble:

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

Une autre commande avec input.txt Fichier URL.

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

fichier 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'

Ou cette commande quelque temps si nécessaire:

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

Enfin, pour cette vitesse de téléchargement était bonne, PEUT-ÊTRE ma cible de serveur a une bande passante limitée. : - (

6
Nabi K.A.Z.

La bonne façon de concaténer plusieurs fichiers vidéo à partir de la liste de lecture m3u8 est

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


  • la liste de lecture m3u8 peut être sur le Web ou localement dans le répertoire
    • il contient la liste des chemins de fichiers relatifs à la playlist
  • -codec copy pour éviter l'encodage (ce qui prend du temps)
  • le type de conteneur est important:
    • *.mp4 est très bien, mais il semble peu lent à multiplexer lorsque la liste de lecture est extraite du Web
    • *.mkv ou *.ts a fonctionné le mieux pour moi
10

tu peux essayer.

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

convertir ts en mp4:

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

0
Gatspy

voici quelques python qui le fait, il vous suffit de fournir l'url du 1er segment et le nombre de segments (à partir du fichier .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)

Ici est le même code avec quelques autres cloches et sifflets

0
sam46