Using ffmpeg to change framerate

前端 未结 6 1794
猫巷女王i
猫巷女王i 2020-11-29 01:42

I am trying to convert a video clip (MP4, yuv420p) from 30 fps to 24 fps. The number of frames is correct so my output should change from 20 minutes at 30fps to 25 minutes a

相关标签:
6条回答
  • 2020-11-29 01:47

    You may consider using fps filter. It won't change the video playback speed:

    ffmpeg -i <input> -filter:v fps=fps=30 <output>
    

    Worked nice for reducing fps from 59.6 to 30.

    0 讨论(0)
  • 2020-11-29 01:47

    To the best of my knowledge you can't do this with ffmpeg without re-encoding. I had a 24fps file I wanted at 25fps to match some other material I was working with. I used the command ffmpeg -i inputfile -r 25 outputfile which worked perfectly with a webm,matroska input and resulted in an h264, matroska output utilizing encoder: Lavc56.60.100

    You can accomplish the same thing at 6fps but as you noted the duration will not change (which in most cases is a good thing as otherwise you will lose audio sync). If this doesn't fit your requirements I suggest that you try this answer although my experience has been that it still re-encodes the output file.

    For the best frame accuracy you are still better off decoding to raw streams as previously suggested. I use a script for this as reproduced below:

    #!/bin/bash
    #This script will decompress all files in the current directory, video to huffyuv and audio to PCM
    #unsigned 8-bit and place the output #in an avi container to ease frame accurate editing.
    for f in *
    do
    ffmpeg -i "$f" -c:v huffyuv -c:a pcm_u8 "$f".avi
    done
    

    Clearly this script expects all files in the current directory to be media files but can easily be changed to restrict processing to a specific extension of your choosing. Be aware that your file size will increase by a rather large factor when you decompress into raw streams.

    0 讨论(0)
  • 2020-11-29 01:47

    In general, to set a video's FPS to 24, almost always you can do:

    With Audio and without re-encoding:

    # Extract video stream
    ffmpeg -y -i input_video.mp4 -c copy -f h264 output_raw_bitstream.h264
    # Extract audio stream
    ffmpeg -y -i input_video.mp4 -vn -acodec copy output_audio.aac
    # Remux with new FPS 
    ffmpeg -y -r 24 -i output_raw_bitstream.h264 -i output-audio.aac -c copy output.mp4
    

    If you want to find the video format (H264 in this case), you can use FFprobe, like this

    ffprobe -loglevel error -select_streams v -show_entries stream=codec_name -of default=nw=1:nk=1 input_video.mp4
    

    which will output:

    h264

    Read more in How can I analyze file and detect if the file is in H.264 video format?


    With re-encoding:

    ffmpeg -y -i input_video.mp4 -vf -r 24 output.mp4
    
    0 讨论(0)
  • 2020-11-29 01:48

    You can use this command and the video duration is still unaltered.

    ffmpeg -i input.mp4 -r 24 output.mp4
    
    0 讨论(0)
  • 2020-11-29 01:52

    With re-encoding:

    ffmpeg -y -i seeing_noaudio.mp4 -vf "setpts=1.25*PTS" -r 24 seeing.mp4
    

    Without re-encoding:

    First step - extract video to raw bitstream

    ffmpeg -y -i seeing_noaudio.mp4 -c copy -f h264 seeing_noaudio.h264
    

    Remux with new framerate

    ffmpeg -y -r 24 -i seeing_noaudio.h264 -c copy seeing.mp4
    
    0 讨论(0)
  • 2020-11-29 02:07

    Simply specify the desired framerate in "-r " option before the input file:

    ffmpeg -y -r 24 -i seeing_noaudio.mp4 seeing.mp4
    

    Options affect the next file AFTER them. "-r" before an input file forces to reinterpret its header as if the video was encoded at the given framerate. No recompression is necessary. There was a small utility avifrate.exe to patch avi file headers directly to change the framerate. ffmpeg command above essentially does the same, but has to copy the entire file.

    0 讨论(0)
提交回复
热议问题