问题
I tried to cut the video using the start and end time of the video by using the following command
ffmpeg -ss 00:00:03 -t 00:00:08 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4
By using the above command i want to cut the video from 00:00:03
to 00:00:08
. But it is not cutting the video between those times instead of that it is cutting the video with first 11 seconds. can anyone help me how resolve this?
Edit 1:
I have tried to cut by using the following command which is suggested by mark4o
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
But it was shown the following error.
the encoder \'aac\' is experimental but experimental codecs are not enabled
so i added the -strict -2
into the command i.e.,
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4
Now it is working fine.
回答1:
You probably do not have a keyframe at the 3 second mark. Because non-keyframes encode differences from other frames, they require all of the data starting with the previous keyframe.
With the mp4 container it is possible to cut at a non-keyframe without re-encoding using an edit list. In other words, if the closest keyframe before 3s is at 0s then it will copy the video starting at 0s and use an edit list to tell the player to start playing 3 seconds in.
If you are using the latest ffmpeg from git master it will do this using an edit list when invoked using the command that you provided. If this is not working for you then you are probably either using an older version of ffmpeg, or your player does not support edit lists. Some players will ignore the edit list and always play all of the media in the file from beginning to end.
If you want to cut precisely starting at a non-keyframe and want it to play starting at the desired point on a player that does not support edit lists, or want to ensure that the cut portion is not actually in the output file (for example if it contains confidential information), then you can do that by re-encoding so that there will be a keyframe precisely at the desired start time. Re-encoding is the default if you do not specify copy
. For example:
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
When re-encoding you may also wish to include additional quality-related options or a particular AAC encoder. For details, see ffmpeg's x264 Encoding Guide for video and AAC Encoding Guide for audio.
Also, the -t
option specifies a duration, not an end time. The above command will encode 8s of video starting at 3s. To start at 3s and end at 8s use -t 5
. If you are using a current version of ffmpeg you can also replace -t
with -to
in the above command to end at the specified time.
回答2:
Try using this. It is the fastest and best ffmpeg-way I have figure it out:
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c copy output.mp4
This command trims your video in seconds!
I have explained it on my blog here:
-i: This specifies the input file. In that case, it is (input.mp4).
-ss: Used with -i, this seeks in the input file (input.mp4) to position.
00:01:00: This is the time your trimmed video will start with.
-to: This specifies duration from start (00:01:40) to end (00:02:12).
00:02:00: This is the time your trimmed video will end with.
-c copy: This is an option to trim via stream copy. (NB: Very fast)
The timing format is: hh:mm:ss
Please note that the current highly upvoted answer is outdated and the trim would be extremely slow. For more information, look at this official ffmpeg article.
回答3:
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4
Use -c copy for make in instantly. In that case ffmpeg will not re-encode video, just will cut to according size.
回答4:
ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4
Drop everything except from second 3 to second 8.
回答5:
To cut based on start and end time from the source video and avoid having to do math, specify the end time as the input option and the start time as the output option.
ffmpeg -t 1:00 -i input.mpg -ss 45 output.mpg
This will produce a 15 second cut from 0:45 to 1:00.
This is because when -ss
is given as an output option, the discarded time is still included in the total time read from the input, which -t
uses to know when to stop. Whereas if -ss
is given as an input option, the start time is seeked and not counted, which is where the confusion comes from.
It's slower than seeking since the omitted segment is still processed before being discarded, but this is the only way to do it as far as I know. If you're clipping from deep within a large file, it's more prudent to just do the math and use -ss
for the input.
回答6:
Here's what I just used:
ffmpeg -i input.mkv -ss 00:01:00 -to 00:02:00 -c:v copy -c:a copy output.mp4
Generated mp4 file could also be used in iMovie
.
Reference: https://www.arj.no/2018/05/18/trimvideo/
回答7:
Even though I'm 6 years late, but I think all the answers above didn't properly address the question @kalai is asking. The bash script below will process a text file in the following format:
URL | start_time | end_time | filename
for example
https://www.youtube.com/watch?v=iUDURCrvrMI|00:02:02|00:03:41|1
and loop through the file, downloads the file that youtube-dl
supports, calculating duration between start_time
and end_time
and passing it to ffmpeg
, since -t
is actually the duration, not the real end_time
Hit me up if you have any question.
for i in $(<video.txt);
do
URL=`echo $i | cut -d "|" -f 1`;
START=`echo $i | cut -d "|" -f 2`;
END=`echo $i | cut -d "|" -f 3`;
FILE=`echo $i | cut -d "|" -f 4`;
SEC1=`echo $START | sed 's/^/((/; s/:/)*60+/g' | bc`
SEC2=`echo $END | sed 's/^/((/; s/:/)*60+/g' | bc`
DIFFSEC=`expr ${SEC2} - ${SEC1}`
ffmpeg $(youtube-dl -g $URL | sed "s/.*/-ss $START -i &/") -t $DIFFSEC -c copy $FILE".mkv";
ffmpeg -i $FILE".mkv" -f mp3 -ab 192000 -vn $FILE".mp3";
rm $FILE".mkv";
done;
来源:https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg