ffmpeg - Comment puis-je couper précisément à partir d'une image clé lors de la copie d'un codec?

1

L'utilisation de -ss en tant qu'option d'entrée avec -c: v copy risque de ne pas être précise, car ffmpeg est obligé d'utiliser uniquement / split sur les images i. Bien que cela puisse, si possible, ajuster l'heure de début du flux à une valeur négative pour compenser cela. Fondamentalement, si vous spécifiez "seconde 157" et qu'il n'y a pas d'image clé avant la seconde 159, deux secondes d'audio (sans vidéo) sont incluses au début, puis démarrent à partir de la première image clé . Soyez donc prudent lorsque vous séparez et copiez le codec.

Pour éviter cela, j'ai d'abord essayé de trouver les horodatages des images nécessaires pour -sset -to en construisant une tuile de toutes les images proches. J'ai généré les tuiles en utilisant

ffmpeg -i "INPUT.mkv" -ss 09:55 -t 3 -vf "drawtext=fontfile=I\\:\Misc\\\\~Software\\\\~OS\\\\I386\\\\arial.ttf: fontsize=60: text='F%{n}\(%{pict_type}\)\@%{pts\:hms}': x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1,scale=320:-1,tile=layout=12x10" tiles%03d.png

et selon eux, l'image clé nécessaire devrait commencer à 00: 09: 56.012, et la dernière image nécessaire devrait être 00: 10: 00.224. Cependant, le fragment créé lors de la découpe avec ces horodatages

ffmpeg -i "INPUT.mkv" -map 0:0 -map 0:4 -map 0:5 -map 0:6 -ss 09:56.012 -to 00:10:00.224 -vcodec copy -acodec copy J01.mkv

commence à une image non clé (son seulement) et se termine également au mauvais endroit. En revanche, couper le même fragment dans Avidemux fonctionne bien, même si les paramètres de sortie Copyvidéo et audio sont définis sur (IIUC, pas de réencodage et démarrer à partir d'une image sans clé). Les horodatages affichés dans Avidemux sont également différents ( -ss 09:56.346 -to 10:00.558vs -ss 09:56.012 -to 10:00.224).

J'ai également essayé de couper par pkt_dts_time ( https://stackoverflow.com/questions/14005110/ ), mais cela n'a pas fonctionné non plus.

ps Une autre procédure similaire à ce que j'essaie de faire (à Avidemux susmentionné) consiste à effectuer un zoom avant dans la chronologie de Sony Vegas jusqu'à ce que vous puissiez passer d'une image à l'autre, puis définir la première image après le changement de scène (qui clé) en tant que point de départ et dernière image de la même scène (après quoi vient la prochaine image clé non nécessaire) en tant que point final, puis le rendu. Quelque chose comme cela peut également être fait dans Avidemux tout en copiant les flux vidéo et audio.

edit1: Voici le journal de la -copytsversion: pastebin. com / Cxzrc8Er. Devrais-je faire les autres aussi?


edit2: Voici les résultats pour "PATHTO\ffprobe.exe" -select_streams v -show_entries packet=pts_time,flags -of compact -read_intervals 580%600 "INPUT.mkv" | findstr K.

packet|pts_time=578.160000|flags=K
packet|pts_time=581.205000|flags=K
packet|pts_time=583.499000|flags=K
packet|pts_time=585.042000|flags=K
packet|pts_time=588.671000|flags=K
packet|pts_time=594.885000|flags=K
packet|pts_time=596.012000|flags=K

J'ai également essayé toute la combinaison de commandes (mosaïques, listant les cadres de cette façon, découpant fragment de deux manières différentes) sur 2 autres vidéos, et les résultats sont similaires. Les durées des images clés listées dans le terminal à l’aide de votre commande suggérée correspondent à celles des tuiles créées par le mien; et généralement, couper avec ma méthode laisse une petite section gelée (~ 1s) au début et parfois plusieurs images indésirables à la fin et couper avec votre méthode laisse un flux vidéo vide plus long au début.

J'ai également trouvé un meilleur fragment vidéo à expérimenter, car il est visuellement plus facile de déterminer le nombre de trames recherchées manquantes et d'indépendants ajoutés (imgur.com / a / DTzmt, une partie appropriée peut être téléchargée à l'adresse bit.ly / Kmnz112f1). Votre solution a également mieux fonctionné.

De plus, pour vous assurer que: Voulez-vous dire -ss 09: 56.01 3 et non -ss 09: 56.01 2 dans votre solution d'origine? Et ai-je raison de supposer que cela fonctionne généralement avec les vidéos que vous coupez et que ce n'est pas le cas pour les miennes?


Imfego
la source
Oui, 013. Ma commande fonctionne sur votre échantillon. Il y a une trame I à 15,398 et -ss 15.399j'utilise une sortie avec la première trame comme première image du changement de scène par rapport à l'escalator. Avec -ss 15.398, il coupe de l'image clé avant.
Gyan
La différence pourrait-elle être un problème de version? Je reçois [email protected] en utilisant des vignettes (imgur.com/a/eIOX2), "Codec non pris en charge avec l'ID 98304 pour le flux d'entrée *" avec la méthode de listage KF, et [email protected] en utilisant pict_type de ffplay + drawtext. L'utilisation de -ss 15-399 \ .816 \ .850 génère des fichiers avec de gros morceaux noirs au début. Aussi, pouvez-vous s'il vous plaît télécharger la découpe de travail pour que je vérifie si cela fonctionne sur ma machine \ players?
Imfego
datafilehost.com/d/ee6c6ca5 - décochez l'option de gestionnaire de téléchargement avant dl.
Gyan
Quelle version de ffmpeg utilisez-vous?
Gyan
Je vous remercie. Il montre des cadres supplémentaires ( imgur.com/a/eIOX2 ); et quand j’essayais les commandes sur cette scène avant d’éditer2, il y avait aussi des images supplémentaires (je lui ai dit de se terminer à angle droit \ image en quart de cercle ~ 00: 19.523, elle est passée plus loin dans ~ 00: 19.565). Et la version de ffmpeg est la 2.8.4 de ffmpeg-20160415-git-21acc4d-win64-static (pastebin.com/BMUzeTwA).
Imfego

Réponses:

0

Essayer

ffmpeg -ss 09:56.013 -i "INPUT.mkv" -map 0:0 -map 0:4 -map 0:5 -map 0:6 -to 00:10:00.224 -vcodec copy -acodec copy -avoid_negative_ts make_zero J01.mkv
Gyan
la source
Cela a créé une vidéo de 10m11s317ms de long avec l'image 09: 55.970 (voir la vignette) figée pendant environ 11 secondes au début. Essayez de compenser la réinitialisation de l'horodatage avec "ffmpeg -ss 09: 56.013 -i" INPUT.mkv "-map 0: 0 -map 0: 4 -map 0: 5 -map 0: 6 -t 4.211 -vcodec copie -acodec copy -avoid_negative_ts make_zero testRec1.mkv "a créé une vidéo de 15s222ms avec la même image figée longue de 11s avant la partie requise. Ce qui a fait "ffmpeg -ss 09: 56.013 -i" INPUT.mkv "-map 0: 0 -map 0: 4 -map 0: 5 -map 0: 6 -à 00: 10: 00.224 -copies -vcodec copie -acodec copy -avoid_negative_ts make_zero testRec2.mkv "était identique à testRec1.mkv.
Imfego
Collez la sortie complète de la console pour la commande de coupe dans le Q.
Gyan,
Comment vérifiez-vous la lecture?
Gyan
Dans VLC, MPC-HC et KMPlayer, bien que tous sur la même machine (Win7).
Imfego
Vérifions à nouveau vos images clés:ffprobe -select_streams v -show_entries packet=pts_time,flags -of compact -read_intervals 580%600 input.mkv | findstr K
Gyan,