Re-sampling H264 video to reduce frame rate while maintaining high image quality

BrianTheLion picture BrianTheLion · Jun 12, 2012 · Viewed 83.2k times · Source

Here's the mplayer output for a video of interest:

br@carina:/tmp$ mplayer foo.mov 
mplayer: Symbol `ff_codec_bmp_tags' has different size in shared object, consider re-linking
MPlayer 1.0rc4-4.5.2 (C) 2000-2010 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing foo.mov.
libavformat file format detected.
[lavf] stream 0: video (h264), -vid 0
[lavf] stream 1: audio (aac), -aid 0, -alang eng
VIDEO:  [H264]  1280x720  24bpp  59.940 fps  2494.2 kbps (304.5 kbyte/s)
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding)
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 15999->176400)
Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio))
==========================================================================
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Starting playback...
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
VO: [vdpau] 1280x720 => 1280x720 Planar YV12

I'd like to use ffmpeg, mencoder, or some other command-line video transcoder to re-sample this video to a lower framerate without loss of image quality. That is, each frame should remain as crisp as possible.

Attempts

ffmpeg -i foo.mov -r 25 -vcodec copy bar.mov
  • The target frame rate -- 25fps -- is achieved but individual frames are "blocky."
mencoder -nosound -ovc copy foo.mov -ofps 25 -o bar.mov
  • Videos are effectively un-viewable.

Help!

This seems like a simple enough use case. I'm very surprised that obvious things are not working. Is there something wrong with my approach?

Answer

CodeMed picture CodeMed · Jan 21, 2015

A lot has changed since this posting in 2012. I am adding this answer for people like me who find this from the search engines. I had good luck with the following:

ffmpeg -y -i source.mp4 -r 25 -s 160x90 -c:v libx264 -b:v 3M -strict -2 -movflags faststart destination.mp4

Here’s a short explanation on what every parameter does:

  • -y : overwrite output files without asking
  • -i source.mp4 : input file name
  • -r 25 : output frame rate (in frames per second)
  • -s 160x90 : output frame size (in pixel) - inserts the scale video filter
  • -c:v libx264 : output video encoder
    • -c:v is short for -codec:v and -vcodec
  • -b:v 3M : video bitrate (in bit/s) passed to libx264 encoder
  • -strict -2 : governs standards compliance; -2 allows experimental features - required to enable native FFmpeg AAC audio encoder in builds older than version 2015-12-05, see here, AAC is now the default audio encoder.
  • -movflags faststart : move the index to the beginning of the output file (mov and mp4 format specific parameter)

For more details see the official documentation.