Black frames at beginning of video file when file cut

6,388

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.

Share:
6,388

Related videos on Youtube

user1584421
Author by

user1584421

Updated on September 18, 2022

Comments

  • user1584421
    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
      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
    slhck about 7 years
    While 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
    Hashim Aziz over 5 years
    What do you mean by "the -ss can be an input option" here?
  • slhck
    slhck over 5 years
    @Hashim See updated post
  • Smogen
    Smogen almost 5 years
    Using https://github.com/tanersener/mobile-ffmpeg i warnt able to use libx264 because it couldn't be found. Worked when using mpeg4
  • slhck
    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
    Smogen almost 5 years
    I use implementation 'com.arthenica:mobile-ffmpeg-full:4.2.LTS' in my grade dependencies, using ffmpeg in my android app.
  • Grimeire
    Grimeire over 2 years
    Thanks 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
    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
    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.