98 votes

Utilisez le codec de copie ffmpeg pour combiner les fichiers *.ts en un seul mp4.

Je dispose d'une série de segments ts décrits par un seul fichier index.m3u8 :

index.m3u8        
segment1_0_av.ts  
segment2_0_av.ts  
segment3_0_av.ts  
segment4_0_av.ts  
segment5_0_av.ts

Je sais qu'ils sont tous encodés de la même manière. ffprobe me donne ce qui suit :

Input #0, mpegts, from 'segment1_0_av.ts':
  Duration: 00:00:10.00, start: 0.100511, bitrate: 1251 kb/s
  Program 1 
    Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 960x540 [SAR 1:1 DAR 16:9], 12.50 fps, 25 tbr, 90k tbn, 25 tbc
    Stream #0:1[0x101]: Audio: aac ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 105 kb/s
    Stream #0:2[0x102]: Unknown: none ([21][0][0][0] / 0x0015)

J'aimerais les combiner dans un seul conteneur mp4. Mais lorsque j'essaie des commandes comme :

ffmpeg -f concat -i filelist.txt -c copy output.mp4

où je génère le filelist.txt à partir du fichier index.m3u8, cela se plaint de ne pas pouvoir lire différents fichiers. Mais la conversion des fichiers ts eux-mêmes semble fonctionner correctement. Je pense que je n'utilise pas correctement ffmpeg.

Comment utiliser ffmpeg pour combiner les fichiers ts décrits par index.m3u8 dans un seul conteneur mp4 en utilisant le codec de copie ?

114voto

szatmary Points 3136

Je ne suis pas sûr pourquoi ffmpeg vous affiche une erreur. Cependant, le format ts est l'un des rares qui peut simplement être concaténé. Ensuite, une fois que vous avez un seul ts, transmuxez-le en mp4.

Sous Windows:

copy /b segment1_0_av.ts+segment2_0_av.ts+segment3_0_av.ts all.ts
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4

Sous GNU/Linux, en utilisant bash:

cat segment1_0_av.ts segment2_0_av.ts segment3_0_av.ts > all.ts
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4

15 votes

Vous pourriez également avoir besoin de -bsf:a aac_adtstoasc.

2 votes

Il est intéressant de noter que la commande n'est PAS ffmpeg copy ..., c'est copy ... (sous Windows)

63voto

sebastian_t Points 376

En utilisant la commande copier ou cat pour combiner les fichiers comme la réponse principale actuelle de szatmary, vous pourriez vous retrouver avec un fichier qui se lit bien au-delà de la limite et ne peut pas être recherché, en plus de problèmes de lecture.

Au lieu de cela, pour combiner correctement ces fichiers, utilisez ffmpeg comme indiqué dans https://trac.ffmpeg.org/wiki/Concatenate. (Installez ffmpeg ici si vous ne l'avez pas déjà https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg.)

Si vous êtes trop paresseux pour lire mon premier lien, vous devez essentiellement créer un fichier .txt énumérant tous les fichiers que vous souhaitez combiner comme ceci (que mon premier lien vous donne des instructions sur comment faire facilement) dans le dossier où vous effectuez la concaténation:

file '/chemin/vers/le/fichier1'
file '/chemin/vers/le/fichier2'
file '/chemin/vers/le/fichier3'

Voici une copie-coller de mon premier lien sur une façon de créer un fichier texte si vous avez Windows en ligne de commande par exemple, mais évidemment vous pouvez créer le fichier manuellement ou comme vous le souhaitez:

(for %i in (*.ts) do @echo file '%i') > mylist.txt

Vérifiez que votre fichier .txt a l'air bien et est correctement formaté !

Après cela, exécutez la commande suivante en ligne de commande:

ffmpeg -f concat -i mylist.txt -c copy all.ts

où 'mylist.txt' est le fichier .txt que vous venez de créer.

Vérifiez si le fichier résultant lit correctement la vidéo. À partir de là, vous pouvez transmuxer en mp4 comme d'habitude si vous le souhaitez:

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

1 votes

Ce for %i in (*.ts) do ne trie pas correctement pour i >= 10. À part cela, tout fonctionne, merci. En effet, il y avait des problèmes avec le fichier concaténé, sans parler du fait que le fichier réalisé en utilisant votre méthode s'est avéré être 16% plus petit (j'avais 1400 parties de 400ko).

0 votes

@utilisateur pour les nombres dans l'ordre, vous pouvez itérer à travers les nombres comme for i in {1..10}; do echo file \'$i.ts\' >> list.txt ; done

4 votes

Pour moi, cela provoque un bégaiement audio à chaque point de jonction, tandis que la réponse acceptée ne le fait pas. Le fichier résultant est également légèrement plus grand avec cette méthode.

28voto

Francesco Galgani Points 307

Mettons tout ensemble

En utilisant la réponse de Juan Aquino (et corrigeant la première commande pour être compatible avec Bash et en utilisant l'ordonnancement naturel des fichiers), ainsi que la réponse de 7vujy0f0hy, un script de travail simple pour un shell Bash Linux est le suivant :

#!/bin/bash
for i in `\ls *.ts | sort -V`; do echo "file '$i'"; done >> mylist.txt
ffmpeg -f concat -i mylist.txt -c copy -bsf:a aac_adtstoasc video.mp4

1 votes

Merci pour la partie tri. C'est ce qui me manquait.

1 votes

Cette solution économise le travail manuel nécessaire pour énumérer chaque fichier à la main, et je n'ai pas rencontré de problèmes de bégaiement audio lorsque j'ai essayé cette méthode. Ça marche bien!

20voto

La bonne manière de concaténer plusieurs fichiers vidéo à partir d'une playlist m3u8 est

ffmpeg -i "index.m3u8" -codec copy output.mp4


  • la playlist m3u8 peut être en ligne ou localement dans un répertoire
    • elle contient une liste de chemins de fichiers relatifs à la playlist
  • -codec copy pour éviter l'encodage
  • le type de conteneur est important:
    • *.mp4 fonctionne mais semble un peu lent à multiplexer lorsque la playlist est récupérée en ligne
    • *.mkv ou *.ts ont mieux fonctionné pour moi

1 votes

Pour moi, c'est la meilleure façon de télécharger et de combiner des fichiers ts à partir d'une playlist m3u. Notez que dans certains cas, vous pouvez avoir une erreur "Protocole 'https' non autorisé dans la liste blanche 'file,crypto,data'!". Dans ce cas, il suffit de mettre l'option -protocol_whitelist file,http,https,tcp,tls,crypto AVANT le -i file.m3u8.

9voto

7vujy0f0hy Points 481

Réponse 2017

Mais lorsque j'essaie des commandes comme ..., il se plaint de ne pas pouvoir lire différents fichiers.

Lorsque j'exécute ffmpeg -i some.ts -c copy some.mp4 sur une certaine vidéo, je reçois ce message d'erreur :

Flux de bits AAC mal formé détecté : utilisez le filtre de flux de bits audio 
'aac_adtstoasc' pour le corriger (option '-bsf:a aac_adtstoasc' avec ffmpeg)

av_interleaved_write_frame(): Opération non autorisée

Sans surprise, l'exécution de ffmpeg -i some.ts -c copy -bsf:a aac_adtstoasc some.mp4 corrige le problème.

7 votes

Obtenez un ffmpeg assez récent et il le fera désormais automatiquement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X