Super User Asked by curmil on December 1, 2021
I’m trying to use ffmpeg to cut video files at precise times. The ffmpeg help shows an option -timecode_frame_start to specify the starting frame but I am unable to get this command to work. The resulting video always starts at the beginning of the original video. Here’s an example of the command I’m running:
ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg
I’ve moved the timecode_frame_start option before and after the other options with no change in results. Is there an additional option I need to specify? I’ve tried various file formats, mkv, avi, mp4, and it doesn’t appear the problem is codec related. Here is one file I’ve tried:
http://www.seaotter.com/marine/movies/hermit-long-01.mpg
Am I missing something?
LosslessCut is a cross-platform GUI tool that uses FFmpeg as a backend and losslessly cuts your video. You can choose to cut at a keyframe or any frame.
Answered by Expectator on December 1, 2021
I have a solution, but I don't know how to do it using current ffmpeg commands (my trials to copy at keyframes didn't come accurate too. I want to know how ffmpeg decides the cutpoints).
I suggested suggest this algorithm, to divide the segment (t1, t2) that we want to copy to 3 parts:
Note that the first two parts are expected to be small (and one of them or both can be zero length), so, the re-encoding process will be fast. This will make us able to have exact cuts with slightly slower operation but still super faster than re-encoding the full video. It can be even faster if we can do multiple cuts with one command, so we traverse the frames once. I hope if someone can apply this, and tell us how, or mention some of the ffmpeg team, or deliver it to them anyhow.
Answered by M.Hamdy.Ghanem on December 1, 2021
The option
-vf select="between(n,start_frame_num,end_frame_num),setpts=PTS-STARTPTS"
e.g.,
-vf select="between(n,200,300),setpts=PTS-STARTPTS"
cuts video from(includes) 200th to(includes) 300th frame, the sequence counting starts from 0.
Answered by Nuo Chen on December 1, 2021
timecode_frame_start
does not work like this.
Seeking based on frame numbers is not possible. The only way to start at specific frames is to convert a number of frames to ss.ms
syntax, or hh:mm:ss.ms
. So, if your video is at 25 fps, and you want to start at 133 frames, you would need to first calculate the timestamp:
133 / 25 = 5.32
Then run:
ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4
Note that cutting on exact frames with bitstream copy (-c:v copy
) is not possible, since not all frames are intra-coded ("keyframes"). A video must begin with a keyframe to be decoded properly. You will therefore have to re-encode the video, e.g. to H.264 using -c:v libx264
as shown above. You can also choose a lossless codec like -c:v ffv1
which preserves the quality of the input video.
To summarize, -ss
will always be frame-accurate when performing re-encoding.
If you further want to encode a specific number of frames, use -frames:v
, for example:
ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac -frames:v 60 out.mp4
Note that you you also have the choice to use the select
/aselect
filters to select frames/audio samples.
ffmpeg -i input.mp4 -vf 'select=gte(n,100)' -c:v libx264 -c:a aac out.mp4
This, however, is slower than the -ss
option shown above, since the entire video will be decoded.
Answered by slhck on December 1, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP