Extraire «une image sur 10» dans une vidéo à l'aide de VLC ou FFmpeg

12

J'essaie d'extraire "exactement 1 image sur 10" d'une vidéo (c'est-à-dire extraire 1, laisser 9 puis répéter) à des fins scientifiques. La vidéo est de 105 images, 3,5 secondes, 29,97 ips (h.264, .mov, produite par Nikon D3100).

Je l'ai téléchargé ici .

VLC

La commande ci-dessous devrait produire 10 images, mais elle ne produit que 6 images. J'ai essayé différents rapports de scène et aucun d'eux ne produit le nombre correct d'images (pas même près de corriger).

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

Quelqu'un pourrait-il me dire quel est le problème?

FFmpeg

FFmpeg ne semble pas avoir de commande exactement pour mon but. La commande ci-dessous extrait 3 images par seconde, mais comme le FPS n'est pas exactement 30 (plutôt 2,97), cela ne produira pas de résultats corrects pour moi.

De plus, même FFmpeg ne donne pas le nombre correct d'images avec même cette commande. Pour 3,5 secondes de vidéo, j'attends au plus 10 images, mais ce que j'obtiens, c'est 12 images!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

Comment puis-je réaliser ce que je veux?

wmac
la source
1
BTW -sameqne fait pas ce que vous pensez probablement qu'il a fait, et a été supprimé de la version actuelle (le vrai ffmpeg c'est-à-dire, je ne sais pas si c'est dans le faux ffmpeg d'Ubuntu). Utilisez plutôt qscale.
stib

Réponses:

21

Sélectionnez 1 image sur 10 images

Pour ce faire, vous pouvez utiliser le selectfiltre vidéo ffmpeg:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • Pour la sortie JPG, vous pouvez varier la qualité avec -q:v. La plage efficace est de 2 (meilleure qualité) à 31 (pire qualité). Vous n'avez pas besoin de cette option si vous souhaitez plutôt exporter en PNG.

  • Ceci affichera img_001.jpg, img_002.jpg, img_003.jpg, etc.

llogan
la source
Cela semble très intéressant, mais semble nécessiter une version particulière ou quelque chose de plus compilé. unrecognized option '-filter:v'J'obtiens " " avec "FFmpeg version SVN-r0.5.1-4: 0.5.1-1ubuntu1.3" (--enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect - -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk
Je ne peux pas non plus exécuter la commande et recevoir l'erreur suivante sur les fenêtres ffmpeg N-35709-g7d531e8: [select @ 017EBB00] [Eval @ 0022DC08] Missing ')' ou trop d'arguments dans 'mod (n \, 10))' [ select @ 017EBB00] Erreur lors de l'analyse de l'expression 'not (mod (n \, 10))' Erreur d'initialisation du filtre 'select' avec args 'not (mod (n \, 10))' Erreur d'ouverture des filtres!
wmac
@mivk Votre version FFmpeg du repo Ubuntu n'a pas de capacités de filtrage. Vous devrez compiler FFmpeg .
llogan
1
@wmac Je suppose que Windows n'aime pas les guillemets simples. Les changer pour des guillemets doubles: ".
llogan
1
@LordNeckbeard, merci, il fonctionne correctement et a résolu tout le problème. J'apprécie vraiment vraiment votre aide.
wmac
4

L'aspect le plus important de votre question est le fait que la vidéo utilise 29,97 images par seconde, pas 30. Pesky NTSC.

Quoi qu'il en soit, je pense qu'il serait plus facile d'extraire simplement chaque image , puis de supprimer celles dont vous n'avez pas besoin:

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

Ensuite, supprimez ceux dont vous n'avez pas besoin. Puisque chaque dixième cadre se terminera par un 1.jpg, nous pouvons simplement prendre tous les autres…

find . -maxdepth 1 -not -iname "*1.jpg"

… Et une fois que vous êtes sûr que ce sont ceux que vous souhaitez supprimer:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

Si vous pouvez utiliser mencoder, vous pouvez essayer l' framestepoption, comme expliqué dans la documentation , comme framestep=10dans votre cas. Personnellement, je n'ai pas pu l'installer / l'essayer.

slhck
la source
1
Merci beaucoup pour votre aide et votre modification. J'ai essayé mencoder et même celui-là a un problème! Je suppose que cela a quelque chose à voir avec le codec ou le conteneur. ffmpeg extrait exactement 105 images avec la commande ci-dessous: ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg% 03d.jpg mais mencoder extrait seulement 90 images !!! avec la commande ci-dessous: mplayer -vo png 1.mov L'utilisation de framestep = 10 produit également un nombre incorrect d'images. Je suis choqué de voir comment les trois (ffmpeg, vlc et mencoder) sont incapables de faire une tâche aussi simple correctement. J'ai soumis un rapport de bogue au site Web de VLC. Merci encore.
wmac
0

Si vous deviez d'abord convertir la vidéo en une série d'images rgb24 ou rgb32 brutes, vous pourriez peut-être obtenir le bon nombre d'images car, sous sa forme originale, il semble y avoir des types de trame inhabituels qui peuvent ne pas être du tout des images ?? ?

Dans les disques laser originaux, la vidéo entière était composée d'une série d'images avec des numéros d'image individuels de 1 à 100 000 ou plus, et comme cela est vraiment la bonne façon d'établir une ligne de base pour de futures conversions ou manipulations.

L'industrie est passée à cette étrange idée de compression simplement pour réduire les sommes dépensées et corrompre les véritables formes scientifiques de traitement des nombres.

Vous devez d'abord extraire tout audio sous forme de fichier wave afin de ne pas perdre complètement l'audio. Il semble que FFMPEG place les informations d'identification dans chaque image extraite, car si vous essayez de chaîner des images à partir de celles que vous venez d'extraire, et que vous mélangez d'autres images d'autres sources avec la même extension, ffmpeg ignorera les images que vous avez essayé de reconstituer au milieu de tout. .

Avec le format de disque laser, la fréquence d'images est simplement dictée par la fréquence à laquelle vous présentez les images séquentielles et n'est en aucun cas contrôlée par les images elles-mêmes.

FFMPEG peut prendre une leçon de la science au lieu de l'art pour une manipulation et un affichage corrects des images de toute nature. Ou peut-être l'ensemble de l'industrie audiovisuelle elle-même. L'industrie a vraiment besoin d'améliorer les capacités du matériel et d'utiliser des données brutes qui nécessitent beaucoup de mémoire / stockage. Rien ne vaut les données brutes pour la précision et l'exactitude.

Aluetta
la source