[FFmpeg-user] Explanation of how -r affects frame rate of filtergraph
Peter
pdc.cse+ffmpeg at gmail.com
Thu Feb 27 03:02:34 EET 2020
Hello,
I've seen some odd behavior with using -r that I cannot see documented.
Twos input are a png images (just pure white in this example), another is a
30fps mp4. The output is set to 30fps using the "-r" option.
ffmpeg -y -loop 1 -i background.png -i source.numbered.mp4 -loop 1 -i
background.png -filter_complex_script filtergraph -r 30.0 -colorspace bt709
-color_trc bt709 -color_primaries bt709 -color_range tv r_before_output.mp4
This results in a 30fps video but frames are dropped from the video source,
resulting in duplicates in the final output.
A "fix" seems to be to specify the frame rate of the first image input, and
not of the output at all. Like so:
ffmpeg -y -loop 1 -r 30 -i background.png -i source.numbered.mp4 -loop 1 -i
background.png -filter_complex_script filtergraph -colorspace bt709
-color_trc bt709 -color_primaries bt709 -color_range tv
r_before_first_input.mp4
This also results in a 30fps output with all frames present but seems
counter intuitive to put the frame rate on an image input. I wasn't able to
find documentation on this behavior. Is someone able to explain how this is
working internally? And whether or not this "fix" is actually reliable or
just a lucky coincidence?
Thanks,
Peter
Full console output from the commands listed above:
$ cat filtergraph
[1]drawtext=fontfile=Arial.ttf: text='start %{frame_num}': start_number=1:
x=10: y=h-(2*lh): fontcolor=black: fontsize=20: box=1: boxcolor=white:
boxborderw=5[trimmed1];
[trimmed1]scale=out_color_matrix=bt709[vcolored1];
[vcolored1]drawtext=fontfile=Arial.ttf: text='beforeloop %{frame_num}':
start_number=1: x=400: y=h-(2*lh): fontcolor=black: fontsize=20: box=1:
boxcolor=white: boxborderw=5[vlooped1];
[vlooped1]format=pix_fmts=rgba,pad=w=max(1280.000000\,0.000000+iw)-min(0\,0.000000):h=max(720.000000\,0.000000+ih)-min(0\,0.000000):x=max(0\,0.000000):y=max(0\,0.000000):color=black at 0.0
,crop=w=1280:h=720:x=0+abs(min(0\,0.000000)):y=0+abs(min(0\,0.000000)):w=1280:h=720:x=0+abs(min(0\,0.000000)):y=0+abs(min(0\,0.000000))[tx1];
[tx1]drawtext=fontfile=Arial.ttf: text='before blend %{frame_num}':
start_number=1: x=700: y=h-(2*lh): fontcolor=black: fontsize=20: box=1:
boxcolor=white: boxborderw=5[txx1];
[txx1][2]blend=c3_mode=multiply:shortest=1[o1];
[0][o1]overlay=x=0.0:y=0.0:shortest=1[stacked];
[stacked]drawtext=fontfile=Arial.ttf: text='end %{frame_num}':
start_number=1: x=1000: y=h-(2*lh): fontcolor=black: fontsize=20: box=1:
boxcolor=white: boxborderw=5[cropped];
[cropped]null
$ ffmpeg -y -loop 1 -i background.png -i source.numbered.mp4 -loop 1 -i
background.png -filter_complex_script filtergraph -r 30.0 -colorspace bt709
-color_trc bt709 -color_primaries bt709 -color_range tv r_before_output.mp4
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.17)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.2.2_2 --enable-shared
--enable-pthreads --enable-version3 --enable-avresample --cc=clang
--host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl
--enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus
--enable-librubberband --enable-libsnappy --enable-libtesseract
--enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx
--enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid
--enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r
--enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb
--enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr
--enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Input #0, png_pipe, from 'background.png':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: png, monob(pc), 1280x720, 25 fps, 25 tbr, 25 tbn,
25 tbc
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'source.numbered.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.29.100
Duration: 00:00:05.07, start: 0.000000, bitrate: 4043 kb/s
Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
1280x720, 4039 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : L-SMASH Video Handler
Input #2, png_pipe, from 'background.png':
Duration: N/A, bitrate: N/A
Stream #2:0: Video: png, monob(pc), 1280x720, 25 fps, 25 tbr, 25 tbn,
25 tbc
[Parsed_drawtext_0 @ 0x7fdc88500000] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_2 @ 0x7fdca850bc80] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_6 @ 0x7fdc8840cb00] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_9 @ 0x7fdca8425e40] Using "/Library/Fonts/Verdana.ttf"
Stream mapping:
Stream #0:0 (png) -> overlay:main
Stream #1:0 (h264) -> drawtext
Stream #2:0 (png) -> blend:bottom
null -> Stream #0:0 (libx264)
Press [q] to stop, [?] for help
[Parsed_drawtext_0 @ 0x7fdc58400d00] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_2 @ 0x7fdc89805400] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_6 @ 0x7fdca8711e80] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_9 @ 0x7fdca8588680] Using "/Library/Fonts/Verdana.ttf"
[swscaler @ 0x7fdcb0440000] deprecated pixel format used, make sure you did
set range correctly
[libx264 @ 0x7fdca900ea00] using cpu capabilities: MMX2 SSE2Fast SSSE3
SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x7fdca900ea00] profile High, level 3.1
[libx264 @ 0x7fdca900ea00] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC
codec - Copyleft 2003-2018 - 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=-2 threads=22
lookahead_threads=3 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 'r_before_output.mp4':
Metadata:
encoder : Lavf58.29.100
Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuvj420p(pc,
bt709), 1280x720, q=-1--1, 30 fps, 15360 tbn, 30 tbc (default)
Metadata:
encoder : Lavc58.54.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame= 151 fps= 72 q=-1.0 Lsize= 2149kB time=00:00:04.93
bitrate=3568.7kbits/s dup=25 drop=0 speed=2.37x
video:2147kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: 0.122016%
[libx264 @ 0x7fdca900ea00] frame I:1 Avg QP:25.04 size:162815
[libx264 @ 0x7fdca900ea00] frame P:50 Avg QP:25.26 size: 22169
[libx264 @ 0x7fdca900ea00] frame B:100 Avg QP:30.86 size: 9261
[libx264 @ 0x7fdca900ea00] consecutive B-frames: 0.7% 33.1% 0.0% 66.2%
[libx264 @ 0x7fdca900ea00] mb I I16..4: 4.1% 41.4% 54.6%
[libx264 @ 0x7fdca900ea00] mb P I16..4: 0.9% 14.9% 3.6% P16..4: 27.9%
6.1% 4.5% 0.0% 0.0% skip:42.2%
[libx264 @ 0x7fdca900ea00] mb B I16..4: 0.5% 7.0% 1.4% B16..8: 15.5%
4.1% 1.5% direct: 1.5% skip:68.5% L0:63.6% L1:32.2% BI: 4.1%
[libx264 @ 0x7fdca900ea00] 8x8 transform intra:75.8% inter:68.0%
[libx264 @ 0x7fdca900ea00] coded y,uvDC,uvAC intra: 78.1% 84.0% 33.9%
inter: 10.5% 15.9% 1.4%
[libx264 @ 0x7fdca900ea00] i16 v,h,dc,p: 22% 31% 4% 43%
[libx264 @ 0x7fdca900ea00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 24% 13% 10% 8%
7% 10% 7% 12% 11%
[libx264 @ 0x7fdca900ea00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 18% 11% 7%
6% 8% 6% 8% 6%
[libx264 @ 0x7fdca900ea00] i8c dc,h,v,p: 42% 20% 26% 13%
[libx264 @ 0x7fdca900ea00] Weighted P-Frames: Y:2.0% UV:0.0%
[libx264 @ 0x7fdca900ea00] ref P L0: 52.5% 19.7% 16.6% 10.9% 0.3%
[libx264 @ 0x7fdca900ea00] ref B L0: 78.7% 18.5% 2.8%
[libx264 @ 0x7fdca900ea00] ref B L1: 99.8% 0.2%
[libx264 @ 0x7fdca900ea00] kb/s:3492.52
$ ffmpeg -y -loop 1 -r 30 -i background.png -i source.numbered.mp4 -loop 1
-i background.png -filter_complex_script filtergraph -colorspace bt709
-color_trc bt709 -color_primaries bt709 -color_range tv
r_before_first_input.mp4
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.17)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.2.2_2 --enable-shared
--enable-pthreads --enable-version3 --enable-avresample --cc=clang
--host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl
--enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus
--enable-librubberband --enable-libsnappy --enable-libtesseract
--enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx
--enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid
--enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r
--enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb
--enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr
--enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Input #0, png_pipe, from 'background.png':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: png, monob(pc), 1280x720, 25 fps, 25 tbr, 25 tbn,
25 tbc
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'source.numbered.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.29.100
Duration: 00:00:05.07, start: 0.000000, bitrate: 4043 kb/s
Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
1280x720, 4039 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : L-SMASH Video Handler
Input #2, png_pipe, from 'background.png':
Duration: N/A, bitrate: N/A
Stream #2:0: Video: png, monob(pc), 1280x720, 25 fps, 25 tbr, 25 tbn,
25 tbc
[Parsed_drawtext_0 @ 0x7f9e48d24380] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_2 @ 0x7f9e48d27480] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_6 @ 0x7f9e28f01f80] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_9 @ 0x7f9e48d26380] Using "/Library/Fonts/Verdana.ttf"
Stream mapping:
Stream #0:0 (png) -> overlay:main
Stream #1:0 (h264) -> drawtext
Stream #2:0 (png) -> blend:bottom
null -> Stream #0:0 (libx264)
Press [q] to stop, [?] for help
[Parsed_drawtext_0 @ 0x7f9e2b007080] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_2 @ 0x7f9e2b027a40] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_6 @ 0x7f9e2b012f40] Using "/Library/Fonts/Verdana.ttf"
[Parsed_drawtext_9 @ 0x7f9e2b00df40] Using "/Library/Fonts/Verdana.ttf"
[swscaler @ 0x7f9e40798000] deprecated pixel format used, make sure you did
set range correctly
[libx264 @ 0x7f9e4900d800] using cpu capabilities: MMX2 SSE2Fast SSSE3
SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x7f9e4900d800] profile High, level 3.1
[libx264 @ 0x7f9e4900d800] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC
codec - Copyleft 2003-2018 - 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=-2 threads=22
lookahead_threads=3 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 'r_before_first_input.mp4':
Metadata:
encoder : Lavf58.29.100
Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuvj420p(pc,
bt709), 1280x720, q=-1--1, 30 fps, 15360 tbn, 30 tbc (default)
Metadata:
encoder : Lavc58.54.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame= 152 fps= 70 q=-1.0 Lsize= 2369kB time=00:00:04.96
bitrate=3907.4kbits/s speed=2.29x
video:2366kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: 0.110847%
[libx264 @ 0x7f9e4900d800] frame I:1 Avg QP:24.90 size:164402
[libx264 @ 0x7f9e4900d800] frame P:38 Avg QP:25.46 size: 23113
[libx264 @ 0x7f9e4900d800] frame B:113 Avg QP:31.00 size: 12210
[libx264 @ 0x7f9e4900d800] consecutive B-frames: 0.7% 0.0% 2.0% 97.4%
[libx264 @ 0x7f9e4900d800] mb I I16..4: 3.6% 41.6% 54.8%
[libx264 @ 0x7f9e4900d800] mb P I16..4: 1.1% 15.6% 3.4% P16..4: 30.0%
6.2% 4.6% 0.0% 0.0% skip:39.0%
[libx264 @ 0x7f9e4900d800] mb B I16..4: 0.6% 9.0% 1.9% B16..8: 16.4%
5.6% 2.1% direct: 2.1% skip:62.4% L0:47.0% L1:48.1% BI: 4.9%
[libx264 @ 0x7f9e4900d800] 8x8 transform intra:76.4% inter:69.5%
[libx264 @ 0x7f9e4900d800] coded y,uvDC,uvAC intra: 76.7% 82.6% 33.1%
inter: 12.2% 17.1% 1.5%
[libx264 @ 0x7f9e4900d800] i16 v,h,dc,p: 24% 29% 4% 42%
[libx264 @ 0x7f9e4900d800] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 24% 13% 10% 8%
7% 10% 7% 12% 11%
[libx264 @ 0x7f9e4900d800] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 18% 12% 7%
6% 8% 6% 8% 6%
[libx264 @ 0x7f9e4900d800] i8c dc,h,v,p: 42% 20% 25% 13%
[libx264 @ 0x7f9e4900d800] Weighted P-Frames: Y:2.6% UV:2.6%
[libx264 @ 0x7f9e4900d800] ref P L0: 47.7% 22.4% 19.5% 10.1% 0.4%
[libx264 @ 0x7f9e4900d800] ref B L0: 76.0% 17.6% 6.4%
[libx264 @ 0x7f9e4900d800] ref B L1: 89.8% 10.2%
[libx264 @ 0x7f9e4900d800] kb/s:3824.97
More information about the ffmpeg-user
mailing list