Comment diviser une vidéo en utilisant FFMPEG, de sorte que chaque morceau commence avec une image clé?
Nous avons besoin de diviser un grand live WMV vidéo en direct en petits morceaux tous de la même taille. Nous avons fait un script qui fonctionne très bien, sauf pour une chose: la vidéo morceaux ne commencez pas avec une image clé, de sorte que lors de la lecture de la plupart des vidéo morceaux ils ne sont pas d'afficher une image jusqu'à ce qu'une image clé à partir de la vidéo d'origine est finalement atteint.
N'est-ce pas là une façon de dire ffmpeg pour la sortie vidéo de commencer avec une image clé?
Ici est de savoir comment nos lignes de commande regarder dès maintenant:
ffmpeg.exe -i "C:\test.wmv" -ss 00:00:00 -t 00:00:05 -acodec copy -vcodec copy -async 1 -y "0000.wmv"
ffmpeg.exe -i "C:\test.wmv" -ss 00:00:05 -t 00:00:05 -acodec copy -vcodec copy -async 1 -y "0001.wmv"
et ainsi de suite...
- Êtes-vous à l'aide d'une récente ffmpeg construire?
- Oui la dernière: version de ffmpeg N-47062-g26c531c. Nous avons également essayé d'utiliser -force_key_frames:v 00:00:00, ou -force_key_frames:v 00:00:05, mais il ne permet pas de faire une différence dans la sortie. Je crois que l'aide -vcodec copy signifie, en réalité, il est juste de copier des groupes de photos dans le nouveau fichier, mais ne sera pas faire toute sorte de réencodage pour ajouter des images clés. Est-ce le cas?
-vcodec copy
de ne pas re-coder: il n'effectue que des dé-multiplexage vers et de multiplexage.- Est-il un moyen pour moi de partager mon fichier en morceaux de sorte que chaque morceau commence avec une image clé? ils n'ont pas à être tous de la même durée. Mais ils doivent être parfaitement contigus. Si je précise-ss sur le fichier d'entrée, il coupe dans l'image clé, mais puis-je voir mes vidéos de chevauchement par re-y compris le même GOP en 2 morceaux consécutifs.
Vous devez vous connecter pour publier un commentaire.
Les dernières versions de FFMPEG inclure une nouvelle option "segment", qui fait exactement ce que je pense que vous avez besoin.
ffmpeg -i INPUT.mp4 -acodec copy -f segment -vcodec copy -reset_timestamps 1 -map 0 OUTPUT%d.mp4
Ce produit une série de numérotée fichiers de sortie qui sont divisés en segments basés sur des Images Clés. Dans mes propres tests, c'est bien travaillé, bien que je ne l'ai pas utilisé sur rien de plus que quelques minutes et seulement dans le format MP4.
Comme indiqué sur le site officiel FFMPEG Docs, il a travaillé en de mieux pour moi de préciser
-ss timestart
avant-i input_file.ext
, parce qu'il définit (ou alors je comprends) le début de la vidéo généré à la plus proche de l'image clé trouvée avant votre date précisée.Changer votre exemple:
J'ai testé cette méthode de travail sur
.flv
et.mp4
fichiers.Voici la solution que je puisse vous mettre au travail:
Comme suggéré par av501 et d33pika, j'ai utilisé ffprobe de trouver l'endroit où les images clés. Parce que ffprobe est très détaillé et peut prendre plusieurs secondes, voire quelques minutes à la sortie de toutes les images clés et il n'y a aucun moyen de l'étendue de la plage d'images que nous voulons une longue vidéo, je procéder en 5 étapes:
Exporter un morceau de la vidéo à partir du fichier d'origine, autour de la double, de la taille de bloc.
Utilisation ffprobe de trouver l'endroit où les images. Choisissez la plus proche de l'image clé après avoir souhaité taille de bloc.
À partir de la sortie de ffprobe obtenir le
pkt_dts_time
de l'image juste avant que l'image clé.ffmpeg sur le exporté partie de l'étape 1, en spécifiant la même entrée et de sortie de fichier, et en spécifiant
-ss 00:00:00
et-t
[valeur trouvée à l'étape 3].Recommencer à l'étape 1, à l'aide de
-ss
[somme cumulée des valeurs trouvées dans l'étape 3 à l'aide d'itérations].De procéder de cette façon, j'ai été en mesure efficace et robuste pour diviser la vidéo en des images clés.
À l'aide d'une version plus récente de ffmpeg, peuvent atteindre cet objectif en utilisant ffprobe et le ffmpeg segment multiplexeur.
1.Utilisation ffprobe et awk pour identifier les images clés d'aussi près que possible de votre choix morceau de la longueur.
Où
La sortie est délimitée par des virgules de la chaîne d'images clés.
2.Utiliser les images clés de sortie au-dessus en tant qu'entrée pour ffmpeg.
ffmpeg -i [SOURCE_VIDEO] -codec-copie de la carte 0 -f segment -segment_frames [OUTPUT_OF_STEP_1] [SEGMENT_PREFIX] _%03d.[SOURCE_VIDEO_EXTENSION]
Où
Utilisation
ffprobe -show_frames -pretty <stream>
pour identifier les images clés.ffprobe -show_frames -read_intervals 10%+20,01:30%01:45 -i <file>
sondes de 10 à 30 secondes, puis à partir de 1:30-1:45.Si vous êtes prêts à faire quelques scripts et je veux avoir des images à un intervalle particulier la seule façon de le faire est
Exécuter ffprobe et de recueillir les emplacements des trames I à partir de la sortie
ffprobe -show_streams
Exécuter une série de -ss -t commandes en utilisant le même script pour obtenir les morceaux que vous désirez.
Vous pouvez avoir votre script de décider du nombre minimum d'images [- dire il y a deux j'ai des photos à l'intérieur de 10 images les uns des autres, vous ne voulez vraiment pas être chunking il n'].
L'autre façon de le faire est d'utiliser gstreamer est multisfilesink et définir le mode d'image clé [cependant qui morceau à chaque image clé, de sorte que peut-être pas idéal]