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?!
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.
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. : - (
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
-codec copy
pour éviter l'encodage (ce qui prend du temps)*.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 moitu 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
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