Comment épisser une partie d'un fichier AVI encodé xvid, avec ffmpeg? (Aucun problème avec d'autres fichiers)

J'utilise la commande suivante, qui fonctionne pour la plupart des fichiers, sauf ce qui semble être encodé xvid

/usr/bin/ffmpeg -sameq -i file.avi -ss 00:01:00 -t 00:00:30 -ac 2 -r 25 -copyts output.avi 

Donc, cela devrait essentiellement imbriquer 30 secondes de vidéo + audio, à partir de la marque de 1 minute.

Il démarre l'encodage à la barre des 00:01:00, mais il va jusqu'à la fin du fichier pour une raison quelconque, en ignorant que je ne veux que 30 secondes.

La sortie ressemble à ceci.

 FFmpeg version git-ecc4bdd, Copyright (c) 2000-2010 the FFmpeg developers built on May 31 2010 04:52:24 with gcc 4.4.3 20100127 (Red Hat 4.4.3-4) configuration: --enable-libx264 --enable-libxvid --enable-libmp3lame --enable-libopenjpeg --enable-libfaac --enable-libvorbis --enable-gpl --enable-nonfree --enable-libxvid --enable-pthreads --enable-libfaad --extra-cflags=-fPIC --enable-postproc --enable-libtheora --enable-libvorbis --enable-shared libavutil 50.15. 2 / 50.15. 2 libavcodec 52.67. 0 / 52.67. 0 libavformat 52.62. 0 / 52.62. 0 libavdevice 52. 2. 0 / 52. 2. 0 libavfilter 1.20. 0 / 1.20. 0 libswscale 0.10. 0 / 0.10. 0 libpostproc 51. 2. 0 / 51. 2. 0 [mpeg4 @ 0x17cf770]Invalid and inefficient vfw-avi packed B frames detected Input #0, avi, from 'file.avi': Metadata: ISFT : VirtualDubMod 1.5.10.2 (build 2540/release) Duration: 00:02:00.00, start: 0.000000, bitrate: 1587 kb/s Stream #0.0: Video: mpeg4, yuv420p, 672x368 [PAR 1:1 DAR 42:23], 25 tbr, 25 tbn, 25 tbc Stream #0.1: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s File 'lol6.avi' already exists. Overwrite ? [y/N] y Output #0, avi, to 'lol6.avi': Metadata: ISFT : Lavf52.62.0 Stream #0.0: Video: mpeg4, yuv420p, 672x368 [PAR 1:1 DAR 42:23], q=2-31, 200 kb/s, 25 tbn, 25 tbc Stream #0.1: Audio: mp2, 48000 Hz, 2 channels, s16, 64 kb/s Stream mapping: Stream #0.0 -> #0.0 Stream #0.1 -> #0.1 Press [q] to stop encoding [mpeg4 @ 0x17cf770]Invalid and inefficient vfw-avi packed B frames detected [buffer @ 0x184b610]Buffering several frames is not supported. Please consume all available frames before adding a new one. frame= 1501 fps=104 q=0.0 Lsize= 15612kB time=30.02 bitrate=4259.7kbits/s ts/s video:15303kB audio:235kB global headers:0kB muxing overhead 0.482620% 

Si je transforme ce fichier en mp4 par exemple, puis je réalise la même action, ça marche parfaitement.

Je présume que votre opération "convertir en MP4" est juste une modification de conteneur, pas une nouvelle codification complète des flux de données A / V. Donc, peut-être FFmpeg est-il accroché à quelque chose de cassé dans ces contenants AVI? Cette ligne de votre sortie pourrait prendre en charge ceci:

[Mpeg4 @ 0x17cf770] Encodages B vfw-avi emballés invalides et inefficaces détectés

Vous pouvez essayer de créer un nouveau conteneur AVI – laissez FFmpeg copier le fichier entier, par exemple avec:

 ffmpeg -i input.avi -vcodec copy -acodec copy output.avi 

Cela devrait créer un nouveau conteneur AVI et copier les flux de données. Ensuite, essayez de nouveau votre commande. Si cela fonctionne, vous avez des AVI cassés (ou éventuellement un bug FFmpeg) – de toute façon, vous pouvez mettre toutes vos vidéos dans de nouveaux conteneurs AVI et le faire de cette façon.

Si cela ne fonctionne pas, vous pouvez regarder plus loin les XviDs cassés et voir ce qu'ils ont en commun.

Je me demande si votre problème est le même que dans cet article:
Convertir un fichier vidéo pour un iPod ou un iPhone

Vous souhaitez utiliser votre nouvelle Apple iPod Video ou Apple iPhone, mais vous ne savez pas comment convertir la vidéo afin qu'elle joue.

Ubuntu 9.10 (Karmic Koala) est livré avec une version de ffmpeg sans support libfaac en raison des problèmes de licence. Cela signifie que vous devrez compiler ffmpeg vous-même. Ce guide explique comment.

L'article explique, étape par étape, comment compiler ffmpeg à la main ou créer un paquet ffmpeg modifié, qui inclut libfaac pour prendre en charge le codage audio avancé (AAC).