All we need is an easy explanation of the problem, so here it is.
I use ffmpeg to cut a video file.
The format i use is this:
ffmpeg -i input.avi -ss 00:06:30 -to 00:07:15 -c copy output.avi
Unfortunately this leaves some black frames in the beginning of my output video, so i lose certain parts of the video. In one video i tried, this went on for one second, in another, the black frames lasted 4 seconds.
The funny thing is that when i used the same command, exactly the same amount of black frame exists for the same video. Meaning, no matter how many times i did this for my second video, in all outputs, the output video will be blank for the first 4 seconds!
The sound works great though!
Here are some other command formats i tried and did NOT work:
ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy cut.mp4 ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4
I thout i found my solution with the command i used, but then this problem occured
EDIT: I figured out that if i don’t use the
-c copy flag, then i do not have the black frames:
ffmpeg -i input.avi -ss 00:06:30 -to 00:07:15 output.avi
However, with this method, the quality of my output video is significantly lower than the input video, or the output video from the previous methods. So i am back at square one.
How to solve :
I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.
Make sure that you are using a recent version of ffmpeg by downloading a static build, for example. There have been some major changes a while ago which affect how stream cutting works.
Here’s the important difference between the commands that you ran:
-c copy, ffmpeg will cut the video without modifying the actual bitstream. In other words, it will take the frames as-is and copy them to the output file. In some cases (simply put, when the starting time does not correspond to an I-frame), ffmpeg needs to include some more frames that are needed to properly decode the first frame to be displayed. Those will get a negative timestamp, so they shouldn’t be shown.
When you leave out
-c copy, ffmpeg will re-encode the video with whatever encoder (
libx264, …) is the default for the chosen output format (AVI or MP4 in your case). These encoders may have default quality or bitrate settings that make the output look bad. When re-encoding, you should therefore know what target quality you want to set.
If cutting with stream copying does not work for you, and if you have to re-encode the video, you may as well use a recent and efficient video codec (H.264) and container (MP4), and copy the audio stream:
ffmpeg -ss 00:10:45 -i input.avi -c:v libx264 -crf 18 -to 00:11:45 -c:a copy output.mp4
Here, the CRF option controls the output quality. Values between 18 and 28 are “normal”, lower values are better. The
-ss option can be an input option (i.e., one that appears before
-i) which makes everything faster.
For more information, read the Seeking guide on the FFmpeg Wiki.
For anyone having the same problem, i finally managed to solve it with this:
ffmpeg -i input.avi -qscale 0 -ss 00:10:45 -to 00:11:45 output.avi
Note: Use and implement method 1 because this method fully tested our system.
Thank you 🙂