[FFmpeg-trac] #2806(undetermined:new): Overlay filter with “shortest=1” drops last frame
FFmpeg
trac at avcodec.org
Wed Jul 24 03:24:48 CEST 2013
#2806: Overlay filter with “shortest=1” drops last frame
-------------------------------------+-------------------------------------
Reporter: hansmi | Type: defect
Status: new | Priority: normal
Component: | Version:
undetermined | unspecified
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Summary of the bug:
Encoding a video using “overlay=shortest=1” in the filter chain will lead
to the last frame being dropped.
Using FFmpeg 1.2.1 installed using MacPorts:
{{{
$ ffmpeg
ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
built on Jun 12 2013 13:46:11 with Apple clang version 4.1
(tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter
--enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora
--enable-libschroedinger --enable-libopenjpeg --enable-libmodplug
--enable-libvpx --enable-libspeex --enable-libass --enable-libbluray
--enable-gnutls --enable-libfreetype --mandir=/opt/local/share/man
--enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64
--enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-
libxvid
libavutil 52. 18.100 / 52. 18.100
libavcodec 54. 92.100 / 54. 92.100
libavformat 54. 63.104 / 54. 63.104
libavdevice 54. 3.103 / 54. 3.103
libavfilter 3. 42.103 / 3. 42.103
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
[…]
}}}
How to reproduce:
{{{
# Generate 30 input frames (requires ImageMagick)
$ for i in {0..30}; do \
convert -alpha on -background none -fill red \
-pointsize 30 -size 200x200 -gravity center \
label:$i png32:frame_$(printf '%03d' $i).png; \
done
# Encode without overlay filter (you have to adjust the
# font path if not testing on Mac OS X)
$ ffmpeg -an \
-f image2 -i 'frame_%03d.png' \
-filter_complex "[0:v]
drawtext=fontfile=/Library/Fonts/Arial.ttf:x=5:y=5:text='frame %{n}'
[out]" \
-map '[out]' \
-vcodec mpeg4 -b:v 600k -flags +aic+mv4 \
working.mp4
# Encode with “overlay=shortest=1” (needed to stop encoding
# when running out of input frames; adjust the font path
# again)
$ ffmpeg -an \
-f image2 -i 'frame_%03d.png' \
-f lavfi -i 'color=c=white:size=200x200' \
-filter_complex "[1:v][0:v] overlay=shortest=1,
drawtext=fontfile=/Library/Fonts/Arial.ttf:x=5:y=5:text='frame %{n}'
[out]" \
-map '[out]' \
-vcodec mpeg4 -b:v 600k -flags +aic+mv4 \
missingframe.mp4
}}}
Notice how the second version is missing a frame:
{{{
$ ffprobe -show_streams -loglevel quiet working.mp4 | grep -w nb_frames
nb_frames=31
$ ffprobe -show_streams -loglevel quiet missingframe.mp4 | grep -w
nb_frames
nb_frames=30
}}}
This can be confirmed by looking at the video. The frame number is encoded
at the top left and is also reflected by the number encoded in the
original PNG files.
--
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/2806>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list