Black frames at beginning of video file when file cut
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:
When specifying
-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 (mpeg4
,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.
Related videos on Youtube
user1584421
Updated on September 18, 2022Comments
-
user1584421 almost 2 years
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.
-
slhck about 7 years"Unfortunately this leaves some black frames in the beginning of my output video" – how are you trying to view the video? Also, please show the full, uncut command line output as well.
-
-
slhck about 7 yearsWhile this does solve the problem you're experiencing. it is not recommended. Here you are re-encoding the video and creating an unnecessarily large output file while doing so.
-
Hashim Aziz over 5 yearsWhat do you mean by "the
-ss
can be an input option" here? -
slhck over 5 years@Hashim See updated post
-
Smogen almost 5 yearsUsing
https://github.com/tanersener/mobile-ffmpeg
i warnt able to uselibx264
because it couldn't be found. Worked when usingmpeg4
-
slhck almost 5 years@Smogen mpeg4 is not very efficient and quite outdated. You apparently compiled mobile-ffmpeg without support for libx264. The project supports it, you have to manually compile it.
-
Smogen almost 5 yearsI use
implementation 'com.arthenica:mobile-ffmpeg-full:4.2.LTS'
in my grade dependencies, using ffmpeg in my android app. -
Grimeire over 2 yearsThanks for the answer but Is it not possible to just re-encode the parts at the start/end so the stop/start time specified is what is used. I dont want to re-encode every thing as my machine is old and does it at less than 0.5 rate so it takes forever. I also do not want to remove those frames as the audio will still be there and result in A&V out of sync. if i try to cut out the 5 minutes of a video using the following command i get an extra few seconds at the start. ffmpeg -ss 00:06:00 -to 00:11:00 -i input.mp4 -map 0 -c copy output.mp4 moving to 06:01 still results in the same.
-
slhck over 2 years@Grimeire Not easily doable. You would have to exactly match the previous encoding settings and find stitching points at intra-frames, then paste together the bitstreams. I would recommend against it and just encoding it at the slow pace.
-
Grimeire over 2 years@slhck thanks thats what i though. I was hoping i was missing something and there was an easy way. I guess i'll just leave the extra few seconds in each video.