Pour travailler avec précision, convertissez d'abord la vidéo en flux binaire RAW YUV (si ce n'est pas déjà fait) en:
ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv
Étape suivante: le select
filtre prend une expression , où n
est le numéro de trame.
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv
Pour ne ffmpeg
pas dupliquer les images, vous devez forcer la moitié de la fréquence d'images de votre entrée - vous définissez donc "2" comme entrée et "1" pour la sortie. N'oubliez pas de remplacer le WxH par les dimensions réelles de votre clip, car le flux binaire brut n'a pas d'en-tête contenant ces informations.
Au lieu de ce qui précède, une autre possibilité serait d'ajouter le setpts
filtre pour définir de nouveaux horodatages pour la sortie. Mais soyez prudent car cela ne permet pas de supprimer les images avec précision. Ici, 25 est la fréquence d'images de sortie réelle que vous souhaitez:
ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv
Vous pouvez bien sûr choisir un autre format de pixel (n'importe lequel ffmpeg -pix_fmts
). Assurez-vous que lors de la lecture du fichier, vous connaissez la taille et le format des pixels:
ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …