Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I want to cut a video by frames with ffmpeg. What I came up with so far is

ffmpeg -i P2.mp4 -vf "fps,setpts='PTS-STARTPTS',select='gte(n\,20)*lte(n\,30)',crop='600:430:100:650',scale='280:-1'" P2o.avi

The parameters are here for testing to see if everything performs as required.

What I get is a video with 20 black frames followed by 10 frames of content. While I want the 10 frames I don't know how the 20 black frames got there. The documentation of the select-filter clearly states that only the frames for which the expression evaluates to a value different to 0 are selected. In the above gte(n,20) should remove them.

If it helps, here the output of ffmpeg:

G:\>ffmpeg -i P2.mp4 -vf "fps,setpts='PTS-STARTPTS',select='gte(n\,20)*lte(n\,30)',crop='600:430:100:650',scale='280:-1'" P2o.avi
ffmpeg version N-50911-g9efcfbe Copyright (c) 2000-2013 the FFmpeg developers
  built on Mar 13 2013 21:26:48 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 19.100 / 52. 19.100
  libavcodec     55.  0.100 / 55.  0.100
  libavformat    55.  0.100 / 55.  0.100
  libavdevice    54.  4.100 / 54.  4.100
  libavfilter     3. 45.103 /  3. 45.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[h264 @ 039a1ae0] mmco: unref short failure
    Last message repeated 5 times
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'P2.mp4':
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.0.100
  Duration: 01:51:58.78, start: 0.000000, bitrate: 8479 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080
 [SAR 1:1 DAR 16:9], 8084 kb/s, 49.96 fps, 50 tbr, 90k tbn, 50 tbc
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, stereo, fltp, 384 kb/s
      handler_name    : SoundHandler
File 'P2o.avi' already exists. Overwrite ? [y/N] y
Invalid pixel aspect ratio 603/602, limit is 255/255 reducing
Output #0, avi, to 'P2o.avi':
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    ISFT            : Lavf55.0.100
    Stream #0:0(und): Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 280x201 [SAR 1:1 DAR 280:201], q=2-31, 200 kb/s, SAR 603:602 DAR 60:43, 25 tbn, 25 tbc
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, fltp
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mpeg4)
  Stream #0:1 -> #0:1 (ac3 -> libmp3lame)
Press [q] to stop, [?] for help
[h264 @ 046f1680] mmco: unref short failure
    Last message repeated 1 times
[h264 @ 05e4a900] mmco: unref short failure
    Last message repeated 3 times
[swscaler @ 039b63e0] Warning: data is not aligned! This can lead to a speedloss

frame=    1 fps=0.0 q=4.2 size=      29kB time=00:00:01.82 bitrate= 131.8kbits/s
frame=   11 fps= 11 q=7.4 size=      71kB time=00:00:03.16 bitrate= 184.4kbits/s
frame=   11 fps=7.2 q=7.4 size=      71kB time=00:00:04.60 bitrate= 126.8kbits/s
frame=   11 fps=5.4 q=7.4 size=      71kB time=00:00:06.19 bitrate=  94.3kbits/s
frame=   11 fps=4.3 q=7.4 size=      71kB time=00:00:07.48 bitrate=  78.0kbits/s
frame=   11 fps=3.6 q=7.4 size=      71kB time=00:00:08.76 bitrate=  66.7kbits/s
frame=   11 fps=3.1 q=7.4 size=      71kB time=00:00:10.08 bitrate=  58.0kbits/s
frame=   11 fps=2.7 q=7.4 size=      71kB time=00:00:11.42 bitrate=  51.1kbits/s
frame=   11 fps=2.6 q=7.4 Lsize=     253kB time=00:00:12.04 bitrate= 171.8kbits/s
video:42kB audio:189kB subtitle:0 global headers:0kB muxing overhead 9.670474%


Does anyone please have a suggestion how I can get rid of those 20 frames? I don't think I can use -ss here.

share|improve this question
I'm not sure if it would cause this problem, but maybe try putting the setpts filter after the select filter? – evilsoup Apr 9 '13 at 19:00
@evilsoup Whow, yes, thanks, that was easy :) If you want some reputation, make that an answer. – sjngm Apr 9 '13 at 19:49
up vote 4 down vote accepted

Try placing the setpts filter after the select filter.

setpts='PTS-STARTPTS' resets the presentation time stamp of each frame (so the first frame is 0.0 seconds, and they increment correctly) - the select filter will send the selected frames to the rest of ffmpeg, but it will not, by itself, alter the presentation time stamp, which can cause all sorts of problems - as you found out.

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .