[FFmpeg-trac] #6128(undetermined:new): Using the concat demuxer with images and specified duration directives produces wrong duration
FFmpeg
trac at avcodec.org
Sun Feb 5 12:36:21 EET 2017
#6128: Using the concat demuxer with images and specified duration directives
produces wrong duration
-------------------------------------+-------------------------------------
Reporter: mulvya | Type: defect
Status: new | Priority: normal
Component: | Version: git-
undetermined | master
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
The FFmpeg wiki entry on Slideshow has a section at
wiki:Slideshow#Concatdemuxer on using the concat demuxer to create a video
from a series of images with custom duration assigned to each image.
However, FFmpeg does not produce a video of the requested total duration.
How to reproduce:
1. Create still images:
{{{
ffmpeg -f lavfi -i color -vframes 1 black.png
ffmpeg -f lavfi -i color=white -vframes 1 white.png
}}}
2. Create concat list as shown in Wiki
{{{
file black.png
duration 6
file white.png
duration 2
}}}
3. Run the concat
{{{
ffmpeg -f concat -i list.txt result.mp4
ffmpeg version N-83410-gb1e2192007 Copyright (c) 2000-2017 the FFmpeg
developers
built with gcc 6.3.0 (Rev1, Built by MSYS2 project)
configuration: --enable-avisynth --enable-libmp3lame --enable-libopus
--enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265
--enable-cuda --enable-cuvid --enable-schannel --enable-sdl2 --enable-
decklink --enable-fontconfig --enable-frei0r --enable-libass --enable-
libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-
libfribidi --enable-libgme --enable-libgsm --enable-libilbc --enable-
libmfx --enable-libmodplug --enable-libopencore-amrnb --enable-
libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-
libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora
--enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-
libwavpack --enable-libwebp --enable-libxavs --enable-libxvid --enable-
libzimg --enable-openssl --enable-libsnappy --enable-gpl --enable-opencl
--enable-opengl --enable-libcdio --enable-libfdk-aac --enable-libkvazaar
--enable-librubberband --enable-libssh --enable-libtesseract --enable-
libzvbi --enable-chromaprint --enable-libopenh264 --enable-libopenmpt
--enable-netcdf --disable-w32threads --enable-version3 --enable-nonfree
--enable-filter=frei0r --disable-debug
libavutil 55. 46.100 / 55. 46.100
libavcodec 57. 75.100 / 57. 75.100
libavformat 57. 66.101 / 57. 66.101
libavdevice 57. 2.100 / 57. 2.100
libavfilter 6. 72.100 / 6. 72.100
libswscale 4. 3.101 / 4. 3.101
libswresample 2. 4.100 / 2. 4.100
libpostproc 54. 2.100 / 54. 2.100
Input #0, concat, from 'list.txt':
Duration: 00:00:08.00, start: 0.000000, bitrate: 0 kb/s
Stream #0:0: Video: png, rgb24(pc), 320x240 [SAR 1:1 DAR 4:3], 25 tbr,
25 tbn, 25 tbc
No pixel format specified, yuv444p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 000000000041c1a0] using SAR=1/1
[libx264 @ 000000000041c1a0] using cpu capabilities: MMX2 SSE2Fast SSSE3
SSE4.2 LZCNT BMI2
[libx264 @ 000000000041c1a0] profile High 4:4:4 Predictive, level 1.3,
4:4:4 8-bit
[libx264 @ 000000000041c1a0] 264 - core 148 r2762 90a61ec - H.264/MPEG-4
AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html -
options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7
psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1
8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=6
lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0
bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25
scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0
qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'result.mp4':
Metadata:
encoder : Lavf57.66.101
Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv444p,
320x240 [SAR 1:1 DAR 4:3], q=-1--1, 25 fps, 12800 tbn, 25 tbc
Metadata:
encoder : Lavc57.75.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
Stream mapping:
Stream #0:0 -> #0:0 (png (native) -> h264 (libx264))
Press [q] to stop, [?] for help
frame= 151 fps=0.0 q=-1.0 Lsize= 6kB time=00:00:05.92 bitrate=
8.0kbits/s dup=149 drop=0 speed=82.1x
video:3kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: 81.122292%
[libx264 @ 000000000041c1a0] frame I:2 Avg QP: 9.00 size: 53
[libx264 @ 000000000041c1a0] frame P:38 Avg QP: 9.29 size: 23
[libx264 @ 000000000041c1a0] frame B:111 Avg QP:12.67 size: 15
[libx264 @ 000000000041c1a0] consecutive B-frames: 2.0% 0.0% 0.0% 98.0%
[libx264 @ 000000000041c1a0] mb I I16..4: 0.3% 99.7% 0.0%
[libx264 @ 000000000041c1a0] mb P I16..4: 0.0% 0.0% 0.0% P16..4:
0.0% 0.0% 0.0% 0.0% 0.0% skip:100.0%
[libx264 @ 000000000041c1a0] mb B I16..4: 0.0% 0.0% 0.0% B16..8:
0.0% 0.0% 0.0% direct: 0.0% skip:100.0%
[libx264 @ 000000000041c1a0] 8x8 transform intra:99.7%
[libx264 @ 000000000041c1a0] coded y,u,v intra: 0.0% 0.0% 0.0% inter: 0.0%
0.0% 0.0%
[libx264 @ 000000000041c1a0] i16 v,h,dc,p: 0% 0% 100% 0%
[libx264 @ 000000000041c1a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 0% 0% 100%
0% 0% 0% 0% 0% 0%
[libx264 @ 000000000041c1a0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 000000000041c1a0] kb/s:3.43
}}}
4. Check output duration
{{{
ffprobe result.mp4 -show_entries format=duration -v 0
[FORMAT]
duration=6.040000
[/FORMAT]
}}}
----
Trying to work around this, by duplicating the last image entry (with or
without duration directive) also produces unexpected output.
5. Updated list
{{{
file black.png
duration 6
file white.png
duration 2
file white.png
duration 1
}}}
6. Concat
{{{
ffmpeg -f concat -i list2.txt result2.mp4
ffmpeg version N-83410-gb1e2192007 Copyright (c) 2000-2017 the FFmpeg
developers
built with gcc 6.3.0 (Rev1, Built by MSYS2 project)
configuration: --enable-avisynth --enable-libmp3lame --enable-libopus
--enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265
--enable-cuda --enable-cuvid --enable-schannel --enable-sdl2 --enable-
decklink --enable-fontconfig --enable-frei0r --enable-libass --enable-
libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-
libfribidi --enable-libgme --enable-libgsm --enable-libilbc --enable-
libmfx --enable-libmodplug --enable-libopencore-amrnb --enable-
libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-
libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora
--enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-
libwavpack --enable-libwebp --enable-libxavs --enable-libxvid --enable-
libzimg --enable-openssl --enable-libsnappy --enable-gpl --enable-opencl
--enable-opengl --enable-libcdio --enable-libfdk-aac --enable-libkvazaar
--enable-librubberband --enable-libssh --enable-libtesseract --enable-
libzvbi --enable-chromaprint --enable-libopenh264 --enable-libopenmpt
--enable-netcdf --disable-w32threads --enable-version3 --enable-nonfree
--enable-filter=frei0r --disable-debug
libavutil 55. 46.100 / 55. 46.100
libavcodec 57. 75.100 / 57. 75.100
libavformat 57. 66.101 / 57. 66.101
libavdevice 57. 2.100 / 57. 2.100
libavfilter 6. 72.100 / 6. 72.100
libswscale 4. 3.101 / 4. 3.101
libswresample 2. 4.100 / 2. 4.100
libpostproc 54. 2.100 / 54. 2.100
Input #0, concat, from 'list2.txt':
Duration: 00:00:09.00, start: 0.000000, bitrate: 0 kb/s
Stream #0:0: Video: png, rgb24(pc), 320x240 [SAR 1:1 DAR 4:3], 25 tbr,
25 tbn, 25 tbc
No pixel format specified, yuv444p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 00000000006dc1a0] using SAR=1/1
[libx264 @ 00000000006dc1a0] using cpu capabilities: MMX2 SSE2Fast SSSE3
SSE4.2 LZCNT BMI2
[libx264 @ 00000000006dc1a0] profile High 4:4:4 Predictive, level 1.3,
4:4:4 8-bit
[libx264 @ 00000000006dc1a0] 264 - core 148 r2762 90a61ec - H.264/MPEG-4
AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html -
options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7
psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1
8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=6
lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0
bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25
scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0
qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'result2.mp4':
Metadata:
encoder : Lavf57.66.101
Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv444p,
320x240 [SAR 1:1 DAR 4:3], q=-1--1, 25 fps, 12800 tbn, 25 tbc
Metadata:
encoder : Lavc57.75.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
Stream mapping:
Stream #0:0 -> #0:0 (png (native) -> h264 (libx264))
Press [q] to stop, [?] for help
frame= 249 fps=0.0 q=-1.0 Lsize= 9kB time=00:00:09.84 bitrate=
7.1kbits/s dup=246 drop=0 speed=88.8x
video:5kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: 78.030922%
[libx264 @ 00000000006dc1a0] frame I:2 Avg QP: 7.50 size: 54
[libx264 @ 00000000006dc1a0] frame P:62 Avg QP: 9.23 size: 23
[libx264 @ 00000000006dc1a0] frame B:185 Avg QP:12.67 size: 15
[libx264 @ 00000000006dc1a0] consecutive B-frames: 0.8% 0.0% 1.2% 98.0%
[libx264 @ 00000000006dc1a0] mb I I16..4: 0.3% 99.7% 0.0%
[libx264 @ 00000000006dc1a0] mb P I16..4: 0.0% 0.0% 0.0% P16..4:
0.0% 0.0% 0.0% 0.0% 0.0% skip:100.0%
[libx264 @ 00000000006dc1a0] mb B I16..4: 0.0% 0.0% 0.0% B16..8:
0.0% 0.0% 0.0% direct: 0.0% skip:100.0%
[libx264 @ 00000000006dc1a0] 8x8 transform intra:99.7%
[libx264 @ 00000000006dc1a0] coded y,u,v intra: 0.0% 0.0% 0.0% inter: 0.0%
0.0% 0.0%
[libx264 @ 00000000006dc1a0] i16 v,h,dc,p: 0% 0% 100% 0%
[libx264 @ 00000000006dc1a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 0% 0% 100%
0% 0% 0% 0% 0% 0%
[libx264 @ 00000000006dc1a0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 00000000006dc1a0] kb/s:3.40
}}}
7. Check duration
{{{
ffprobe result2.mp4 -show_entries format=duration -v 0
[FORMAT]
duration=9.960000
[/FORMAT]
}}}
This time, the duration is greater (9.96 sec) than it should be (9 sec)
Behaviour originally reported at
http://video.stackexchange.com/q/20588/1871
Personally, I believe all the direction durative does is it alters the
offset applied to the starting timestamp of successive files in the concat
list and not enforce a duration per se. So, that explains to me the issue
with the first concat run, but not the second.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/6128>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list