J'ai beaucoup de fichiers vidéo (flv / mp4) qui changent de résolution en cours de flux (720p / 1080p / 640).
J'aimerais utiliser quelque chose comme ffmpeg pour détecter automatiquement le changement de résolution et scinder les vidéos en scènes individuelles, en conservant la qualité d'encodage existante: segment sans réencodage (Video1-scene1.flv, Video1-scene2.flv, etc.) .
J'ai trouvé diverses méthodes pour diviser sur le silence, sur le changement de scène, sur les scènes noires, mais rien d'aussi simple qu'un changement de largeur de résolution.
Ces fichiers entraînent souvent le blocage des éditeurs / trimmers vidéo. Identifier et supprimer manuellement les scènes basse résolution prend beaucoup de temps si je convertis simplement la vidéo entière en 1080p.
L'algorithme est probablement aussi simple que de comparer l'image actuelle à l'image précédente. S'il s'agit de résolutions différentes, divisez la vidéo et démarrez un nouveau segment.
Quelqu'un peut-il aider s'il vous plaît?
EXEMPLE DE FICHIER (temporarily available)
: Example.flv
Voici quelques réponses connexes:
Couper une partie du fichier vidéo de la position de départ à la position de fin avec FFmpeg
https://stackoverflow.com/questions/36074224/how-to-split-video-or-audio-by-silent-parts
Scinder une vidéo à l'aide de FFMPEG via la détection de scène
Ressources supplémentaires:
En utilisant la solution de Lord Neckbeard, je joins le processus (malheureusement très manuel) que je me suis finalement mis à travailler sur Windows 10. Peut-être que cela pourrait engendrer d'autres idées autour de ffmpeg.
(J'ai posté une question distincte destinée à quiconque ayant suffisamment de ressources GURU pour: automatiser ce processus ... )
faites glisser la vidéo sur un fichier de commandes contenant:
ffprobe -v erreur -show_entries frame = pkt_pts_time, largeur, hauteur -select_streams v -of csv = p = 0% 1> allkeyframes.txt
(exemple allkeyframes.txt ...)
13.652000,640,480
13.755000,640,480
13.597000,480,360
13.652000,480,360
collez ce texte dans POWERSHELL:
$o=""
$n=0
foreach($line in (Get-Content allkeyframes.txt)){
$nline = $line.Split(",")
$nline2=($nline[1]+$nline[2])
if ($nline2 -ne $preventry) {
$n0=$nline[0]
$o="$o,$n0"
$n=$n0
}
$preventry = $nline2
}
if ($o.length -gt 1){
echo $o.Remove(0,1) > resolutionchanges.txt
} else {
Write-Host "No resolution changes found" -ForegroundColor Red
}
(resolutionchanges.txt :)
13.597000,25.618000,33.628000,45.598000
Entrez ce qui suit dans la fenêtre de commande, après avoir collé le contenu de resolutionchanges.txt et remplacé "input.flv" par le nom de la vidéo (Win10 a refusé mes tentatives de traitement par lot):
ffmpeg -i input.flv -map 0 -c copy -segment_times 13.597000,25.618000,33.628000,45.598000 -reset_timestamps 1 -f segment de sortie_% 03d.flv