DTS non monotone sur concat (ffmpeg)

17

Après avoir exécuté cette commande ffmpeg -f concat -i mylist.txt -c copy output.mp4- je reçois un output.mp4fichier corrompu et ce message:

ffmpeg -f concat -i mylist.txt -c copy output.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, concat, from 'mylist.txt':
  Duration: N/A, start: 0.000000, bitrate: 829 kb/s
    Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1440x900, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s
Output #0, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf56.25.101
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1440x900, q=2-31, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 15360 tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598061, current: 467644; changing to 598062. This may result in incorrect timestamps in the output file.
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598062, current: 468044; changing to 598063. This may result in incorrect timestamps in the output file.
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598063, current: 468444; changing to 598064. This may result in incorrect timestamps in the output file.
...
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598362, current: 588044; changing to 598363. This may result in incorrect timestamps in the output file.
frame= 1472 fps=0.0 q=-1.0 Lsize=    5825kB time=00:00:49.04 bitrate= 973.0kbits/s
video:4903kB audio:877kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.776358%

Contenu de mylist.txt

file 'cut.mp4'
file 'cut2.mp4'

sortie cut.mp4 de ffmpeg:

ffmpeg -i cut.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cut.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.25.101
  Duration: 00:00:39.04, start: 0.036281, bitrate: 837 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1440x900, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

sortie cut2.mp4 de ffmpeg:

ffmpeg -i cut2.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cut2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.25.101
  Duration: 00:00:10.07, start: 0.000000, bitrate: 1498 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1440x900, 1271 kb/s, 30 fps, 30 tbr, 12k tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 218 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

cut.mp4 J'ai obtenu par cette commande ffmpeg -ss 00:00:11 -i myfile.mp4 -to 00:00:39 -vf 'drawbox= : x=0 : y=0 : color=invert' cut.mp4

cut2.mp4 J'ai obtenu par cette commande ffmpeg -ss 00:00:00 -i myfile.mp4 -to 00:00:10 -c copy cut2.mp4

J'ai beaucoup cherché - je n'ai trouvé aucune solution, peut-être que quelqu'un peut m'aider avec celle-ci.

output.mp4 est jouable, mais semble bizarre.

entrez la description de l'image ici

whitesiroi
la source
1
Pouvez-vous fournir les deux fichiers d'entrée pour que je puisse effectuer des tests?
llogan
@ LordNeckbeard oui, je vous l'ai envoyé, merci beaucoup.
whitesiroi
1
Je n'arrive pas à reproduire le problème exact. J'utilise la version statique la plus récente disponible sur tessus . Les fichiers d'exemple semblent être différents de votre capture d'écran, mais il semble fonctionner correctement dans VLC et QuickTime, sauf que la recherche semble foirée. J'ai testé sur une machine OS X car cela ressemble à ce que vous utilisez.
llogan
@LordNeckbeard Merci beaucoup, oui avec cette version ffmpeg version N-71996-g372aa07-tessus ça marche très bien. Je vous remercie.
whitesiroi
tl; dr; supprimer -c copypour autoriser le réencodage ou l'utilisation -c:a copyuniquement. Ensuite, l'étape de concaténation peut toujours être utilisée -c copycar toutes les vidéos sont déjà ré-encodées. Notez que certaines vidéos avec cet avertissement semblent toujours correctes après la concaténation et donc tout -c copyva bien.
林果 皞

Réponses:

10

Utilisation des dernières ffmpeg

Les utilisateurs généraux doivent toujours utiliser à ffmpegpartir de la branche git master actuelle (le dernier code disponible):

  • Lorsque vous rencontrez un problème, la première chose à faire est de vérifier si vous utilisez une version de git master.
  • Il est considéré comme stable.
  • Il aura plus de corrections de bugs et de fonctionnalités.
  • Le développement de FFmpeg est très actif .
  • Si vous souhaitez obtenir le support des ressources d'aide officielles, vous devez utiliser git master.
  • Les versions sont destinées aux distributeurs.

Voir la page de téléchargement de FFmpeg pour diverses options, ou reportez-vous au wiki FFmpeg: Guides de compilation .

D'autres choses

  • Dans votre commande, drawboxvous pouvez copier à la vapeur l'audio avec -c:a copyau lieu de le ré-encoder.

  • Lors de l'utilisation -ss, -tone fonctionne comme prévu que si -ssest utilisé comme option de sortie.

llogan
la source
Merci beaucoup, cela fonctionne mieux et plus rapidement. Pouvez-vous s'il vous plaît vérifier celui-ci aussi video.stackexchange.com/questions/15477/… Je suis simplement curieux de savoir si cela peut être simplifié.
whitesiroi
@whitesiroi Bien sûr. Répondu, bien qu'il semble que j'aie fait un commentaire à cette question malheureux.
llogan
Désolé.
whitesiroi
1

Selon https://trac.ffmpeg.org/wiki/Concatenate

J'ai eu ce même problème. J'utilise ffmpeg version 2.6.3 sur un mac. J'ai converti mes clips source au format .MTS avec une balise ajoutée de -q 0, mis à jour les extensions dans le fichier texte et défini mon fichier de sortie sur un .MTS lorsque j'ai exécuté la commande concat dans ffmpeg. Ça a marché comme sur des roulettes. Voici mon workflow.

ffmpeg -i clip-1.MOV -q 0 clip-1.MTS

ffmpeg -i clip-2.MOV -q 0 clip-2.MTS

mis à jour le fichier texte (mylist.txt) pour lire:

file clip-1.MTS
file clip-2.MTS

puis exécutez la commande concat comme suit:

ffmpeg -f concat -i mylist.txt -c copy output.MTS

A travaillé pour moi! Vous pouvez convertir la sortie finale.MTS dans le format dont vous avez besoin.

Duncan Lindsey
la source
ce protocole est-il sans perte?
Becko
Non, la première commande est convertie en MPEG-2 qui n'a pas de mode sans perte.
Gyan
1

J'ai eu des erreurs similaires, et l'audio dans mes vidéos de sortie était parfois désynchronisé et parfois complètement manquant, mais j'ai fini par utiliser mkvmergemkvtoolnix à la place.

Mes vidéos d'entrée avaient été encodées avec différents paramètres et elles avaient des dimensions différentes, donc je les ai d'abord redimensionnées et réencodées en utilisant ffmpeg:

for f in *.mp4;do w=1280;h=720;ffmpeg -i $f -filter:v "scale=iw*min($w/iw\,$h/ih):ih*min($w/iw\,$h/ih),pad=$w:$h:($w-iw*min($w/iw\,$h/ih))/2:($h-ih*min($w/iw\,$h/ih))/2" -c:v libx264 -crf 22 -preset slow -pix_fmt yuv420p -c:a libfdk_aac -vbr 3 -ac 2 -ar 44100 ${f%mp4}mkv;done

Certaines de mes vidéos d'entrée n'avaient pas de canal audio, j'ai donc utilisé une commande comme celle-ci pour leur ajouter un canal audio silencieux:

for f in *.mkv;do ffprobe $f|&grep -q '1: Audio'||ffmpeg -i $f -f lavfi -i anullsrc -c:a libfdk_aac -shortest -c:v copy temp-$f;mv {temp-,}$f;done

Après cela, j'ai concaténé les vidéos:

mkvmerge -o /tmp/output.mkv $(printf %s\\n *.mkv|sed '1!s/^/+/')

Si vos fichiers d'entrée ont les mêmes dimensions, le même nombre de canaux audio, la même fréquence d'échantillonnage audio, etc., vous pouvez utiliser simplement mkvmergepour concaténer les fichiers sans perte. Les fichiers d'entrée pour mkvmergepeuvent également avoir un conteneur MP4 mais le fichier de sortie aura un conteneur MKV même si son extension de nom de fichier est spécifiée comme .mp4. Vous pouvez exécuter ffmpeg -i output.mkv -c copy output.mp4pour changer le conteneur.

mkvmergea une syntaxe comme mkvmerge -o output.mkv file1.mkv + file2.mkv + file3.mkv, où mkvmerge -o output.mkv file1.mkv +file2.mkv +file3.mkvest également accepté.

nisetama
la source
1

Basé sur la réponse vraiment utile de Duncan:

for f in ./*.mp4; do ffmpeg -i $f -q 0 "${f%.*}.mts"; done

Ensuite ceci:

ffmpeg -f concat -safe 0 -i <(for f in ./*.mts; do echo "file '$PWD/$f'"; done) -c copy All.mts
Hans-J. Schmid
la source
0

Lorsque j'utilise ffmpeg pour remuxer une vidéo enregistrée (peut être TS, MP4 ou MKV) et obtenir les dts non monotones dans le flux de sortie - horodatages, etc. La seule façon que j'ai trouvée de gérer ce problème de manière fiable est d'utiliser AviDemux. Avec les paramètres de copie pour l'audio et la vidéo et en sélectionnant MP4V2 Muxer, il est possible, sous l'option Configurer, de sélectionner Optimiser pour le streaming. Le fichier MP4 résultant peut maintenant être utilisé dans ffmpeg sans générer de messages d'erreur. Faites confiance à cela est utile.

gjdgjd
la source