Opened 5 years ago

Last modified 15 months ago

#9210 new defect

Malapropos timebase preset for "concat" demuxer?

Reported by: demet64 Owned by:
Priority: normal Component: avformat
Version: git-master Keywords: concat
Cc: sycxyc, MasterQuestionable Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: yes

Description (last modified by demet64)

This issue was also mentioned here: https://www.reddit.com/r/ffmpeg/comments/e1o3hv/ffconcat_filter_with_millisecond_precision_how/ and here: https://forum.videohelp.com/threads/397470-Converting-a-sequence-of-images-to-video-with-variable-framerate

Summary of the bug:
How to reproduce:
A concat file like this

file 000000.jpg
duration 116ms
file 000001.jpg
duration 116ms
file 000002.jpg
duration 116ms
file 000003.jpg
duration 116ms
file 000004.jpg
duration 116ms
file 000005.jpg
duration 116ms
file 000006.jpg
duration 116ms
file 000007.jpg
duration 116ms
file 000008.jpg
duration 116ms
file 000009.jpg
duration 1002ms
file 000010.jpg
duration 116ms
file 000011.jpg
duration 116ms
file 000012.jpg
duration 116ms
file 000013.jpg
duration 1129ms
file 000014.jpg
duration 73ms
file 000015.jpg
duration 73ms
file 000016.jpg
duration 116ms
file 000017.jpg
duration 116ms
file 000018.jpg
duration 2184ms
file 000018.jpg

The output:

ffprobe -f concat -i concat.txt -show_frames | findstr "pkt_pts"
pkt_pts=0
pkt_pts_time=0.000000
pkt_pts=3
pkt_pts_time=0.120000
pkt_pts=6
pkt_pts_time=0.240000
pkt_pts=9
pkt_pts_time=0.360000
pkt_pts=12
pkt_pts_time=0.480000
pkt_pts=15
pkt_pts_time=0.600000
pkt_pts=17
pkt_pts_time=0.680000
pkt_pts=20
pkt_pts_time=0.800000
pkt_pts=23
pkt_pts_time=0.920000
pkt_pts=26
pkt_pts_time=1.040000
pkt_pts=51
pkt_pts_time=2.040000
pkt_pts=54
pkt_pts_time=2.160000
pkt_pts=57
pkt_pts_time=2.280000
pkt_pts=60
pkt_pts_time=2.400000
pkt_pts=88
pkt_pts_time=3.520000
pkt_pts=90
pkt_pts_time=3.600000
pkt_pts=92
pkt_pts_time=3.680000
pkt_pts=95
pkt_pts_time=3.800000
pkt_pts=98
pkt_pts_time=3.920000
pkt_pts=152
pkt_pts_time=6.080000

The output looks correct at first, but timestamps are rounded, and for some reasons the duration here

pkt_pts_time=0.600000
pkt_pts=17
pkt_pts_time=0.680000

is 80ms instead of 120ms (and expected 116ms)

It's not the problem of ffprobe, when converting to webm, for example, or gif

ffmpeg -i concat.txt -c:v libvpx-vp9 -lossless 1 out.webm

timings would be like showed above.

The other case:

file 000000.jpg
duration 50ms
file 000001.jpg
duration 60ms
file 000002.jpg
duration 50ms
file 000003.jpg
duration 60ms
file 000004.jpg
duration 50ms
file 000005.jpg
duration 60ms
file 000006.jpg
duration 50ms
file 000007.jpg
duration 60ms
file 000008.jpg
duration 60ms
file 000009.jpg
duration 50ms
file 000010.jpg
duration 60ms
file 000011.jpg
duration 50ms
file 000012.jpg
duration 60ms
file 000013.jpg
duration 50ms
file 000014.jpg
duration 60ms
file 000015.jpg
duration 50ms
file 000016.jpg
duration 60ms
file 000017.jpg
duration 60ms
file 000018.jpg
duration 50ms
file 000019.jpg
duration 60ms
file 000020.jpg
duration 50ms
file 000021.jpg
duration 60ms
file 000022.jpg
duration 50ms
file 000023.jpg
duration 60ms
file 000023.jpg

Output:

pkt_pts=0
pkt_pts_time=0.000000
pkt_pts=1
pkt_pts_time=0.040000
pkt_pts=3
pkt_pts_time=0.120000
pkt_pts=4
pkt_pts_time=0.160000
pkt_pts=6
pkt_pts_time=0.240000
pkt_pts=7
pkt_pts_time=0.280000
pkt_pts=8
pkt_pts_time=0.320000
pkt_pts=10
pkt_pts_time=0.400000
pkt_pts=11
pkt_pts_time=0.440000
pkt_pts=13
pkt_pts_time=0.520000
pkt_pts=14
pkt_pts_time=0.560000
pkt_pts=15
pkt_pts_time=0.600000
pkt_pts=17
pkt_pts_time=0.680000
pkt_pts=18
pkt_pts_time=0.720000
pkt_pts=19
pkt_pts_time=0.760000
pkt_pts=21
pkt_pts_time=0.840000
pkt_pts=22
pkt_pts_time=0.880000
pkt_pts=24
pkt_pts_time=0.960000
pkt_pts=25
pkt_pts_time=1.000000
pkt_pts=26
pkt_pts_time=1.040000
pkt_pts=28
pkt_pts_time=1.120000
pkt_pts=29
pkt_pts_time=1.160000
pkt_pts=31
pkt_pts_time=1.240000
pkt_pts=32
pkt_pts_time=1.280000
pkt_pts=33
pkt_pts_time=1.320000

Attachments (2)

ffmpeg-20210501-201727.log (111.7 KB ) - added by demet64 5 years ago.
concat.txt (643 bytes ) - added by demet64 5 years ago.

Download all attachments as: .zip

Change History (14)

comment:1 by demet64, 5 years ago

Description: modified (diff)

comment:2 by mkver, 5 years ago

It seems as if this is due to rounding to a timebase of 1/25 somewhere. The exact timestamps in your example would be 0, 116, 232, 348, 464, 580, 696... which get rounded to 0, 120, 240, 360, 480, 600, 680... when using a timebase of 1/25.

comment:3 by demet64, 5 years ago

It seems as if this is due to rounding to a timebase of 1/25 somewhere.

This is what person from reddit thread I mentioned says too. The problem is that it happens on input stream and it seems there's no way you can specify timebase of the input stream

Last edited 5 years ago by demet64 (previous) (diff)

comment:4 by Carl Eugen Hoyos, 5 years ago

Please (test current FFmpeg git head and) provide the command line you tested together with the complete, uncut console output and the necessary input files to make this a valid ticket.

comment:5 by Carl Eugen Hoyos, 5 years ago

Keywords: concat added

by demet64, 5 years ago

Attachment: ffmpeg-20210501-201727.log added

by demet64, 5 years ago

Attachment: concat.txt added

comment:6 by demet64, 5 years ago

I don't know if input images are necessary. I tried the same concat file with different sets of pictures and it didn't have any impact on timecodes.

comment:7 by Andre LaBranche, 5 years ago

The unwanted 25 fps does seem to be coming from concat. I tested that along with image2 and found that image2 honors the frame rate passed as a cli option.

Here's a script that creates some sample images, does a concat run and an image2 run, and collects reports for each.

#!/bin/zsh

OUT=$(mktemp -d)
CATFILE=${OUT}/catfile.txt
pushd ${OUT}
echo "generating some sample images with Imagemagik's 'convert' tool"
for i in {1..60}
do
    IMG=image-$(printf "%03d" ${i}).jpg
    convert -size 600x300 -gravity center -background black \
        -fill purple label:${i} -units PixelsPerInch -density 254 ${IMG}
    echo "file '${IMG}'" >> ${CATFILE}
    echo "duration 0.016" >> ${CATFILE}
done

echo "Wrote sample ffmpeg concat input file: ${CATFILE}"

CONCAT_CMD='ffmpeg -f concat -i ${CATFILE} -report concat.mkv > /dev/null'
export FFREPORT=file=ffprobe-concat.log
echo "Probing concat with:\n${CONCAT_CMD}"
eval ${CONCAT_CMD}
echo "Wrote video ${OUT}/concat.mkv"
echo "Reading frame rate of concat.mkv..."
unset FFREPORT
ffprobe -v error -show_format -show_streams concat.mkv | grep 'frame_rate'

IMAGE2_CMD="ffmpeg -f image2 -framerate 60 -i image-%03d.jpg -report image2.mkv > /dev/null"
echo "\nProbing image2 with:\n${IMAGE2_CMD}"
export FFREPORT=file=ffprobe-image2.log
eval ${IMAGE2_CMD}
echo "Wrote video ${OUT}/image2.mkv"
echo "Reading frame rate of concat.mkv..."
unset FFREPORT
ffprobe -v error -show_format -show_streams image2.mkv | grep 'frame_rate'
echo "\nFull reports for each run: "
ls -1 ${OUT}/ffprobe*.log
open ${OUT}
popd

When run on my machine, it looks like this:

(base) andre@boom matlab_image_tsp % ./duration_snooping.sh 
generating some sample images with Imagemagik's 'convert' tool
Wrote sample ffmpeg concat input file: /var/folders/sc/q27bbsbn105gr0d08r3nd2jr0000gn/T/tmp.PU7y4SbK/catfile.txt
Probing concat with:
ffmpeg -f concat -i ${CATFILE} -report concat.mkv > /dev/null
ffmpeg started on 2021-12-06 at 04:07:22
Report written to "ffprobe-concat.log"
Log level: 48
ffmpeg version 4.4.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with Apple clang version 13.0.0 (clang-1300.0.29.3)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/4.4.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, concat, from '/var/folders/sc/q27bbsbn105gr0d08r3nd2jr0000gn/T/tmp.PU7y4SbK/catfile.txt':
  Duration: 00:00:00.96, start: 0.000000, bitrate: 18 kb/s
  Stream #0:0: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown), 600x300 [SAR 254:254 DAR 2:1], 25 fps, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x12b815400] using SAR=1/1
[libx264 @ 0x12b815400] using cpu capabilities: ARMv8 NEON
[libx264 @ 0x12b815400] profile High 4:4:4 Predictive, level 2.1, 4:4:4, 8-bit
[libx264 @ 0x12b815400] 264 - core 163 r3060 5db6aa6 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - 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=9 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, matroska, to 'concat.mkv':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Video: h264 (H264 / 0x34363248), yuvj444p(pc, bt470bg/unknown/unknown, progressive), 600x300 [SAR 254:254 DAR 2:1], q=2-31, 25 fps, 1k tbn
    Metadata:
      encoder         : Lavc58.134.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
frame=   26 fps=0.0 q=-1.0 Lsize=      14kB time=00:00:00.92 bitrate= 121.6kbits/s dup=0 drop=34 speed=13.4x    
video:13kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 6.463387%
[libx264 @ 0x12b815400] frame I:1     Avg QP:19.46  size:   495
[libx264 @ 0x12b815400] frame P:12    Avg QP:17.97  size:   657
[libx264 @ 0x12b815400] frame B:13    Avg QP:22.41  size:   314
[libx264 @ 0x12b815400] consecutive B-frames: 11.5% 61.5% 11.5% 15.4%
[libx264 @ 0x12b815400] mb I  I16..4:  4.2% 93.6%  2.2%
[libx264 @ 0x12b815400] mb P  I16..4:  1.6%  2.6%  1.4%  P16..4:  8.6%  3.2%  0.5%  0.0%  0.0%    skip:82.1%
[libx264 @ 0x12b815400] mb B  I16..4:  0.8%  1.3%  0.3%  B16..8:  9.7%  2.8%  0.1%  direct: 0.0%  skip:84.9%  L0:38.7% L1:60.7% BI: 0.7%
[libx264 @ 0x12b815400] 8x8 transform intra:71.4% inter:27.3%
[libx264 @ 0x12b815400] coded y,u,v intra: 5.0% 4.1% 4.5% inter: 0.5% 0.3% 0.4%
[libx264 @ 0x12b815400] i16 v,h,dc,p: 53% 38%  8%  0%
[libx264 @ 0x12b815400] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31%  9% 58%  1%  0%  0%  0%  0%  0%
[libx264 @ 0x12b815400] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 21% 47%  3%  2%  2%  2%  1%  2%
[libx264 @ 0x12b815400] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x12b815400] ref P L0: 30.0%  7.6% 51.8% 10.6%
[libx264 @ 0x12b815400] ref B L0: 75.2% 24.0%  0.7%
[libx264 @ 0x12b815400] ref B L1: 96.8%  3.2%
[libx264 @ 0x12b815400] kb/s:95.87
Wrote video /var/folders/sc/q27bbsbn105gr0d08r3nd2jr0000gn/T/tmp.PU7y4SbK/concat.mkv
Reading frame rate of concat.mkv...
r_frame_rate=25/1
avg_frame_rate=25/1

Probing image2 with:
ffmpeg -f image2 -framerate 60 -i image-%03d.jpg -report image2.mkv > /dev/null
ffmpeg started on 2021-12-06 at 04:07:22
Report written to "ffprobe-image2.log"
Log level: 48
ffmpeg version 4.4.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with Apple clang version 13.0.0 (clang-1300.0.29.3)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/4.4.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, image2, from 'image-%03d.jpg':
  Duration: 00:00:01.00, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown), 600x300 [SAR 254:254 DAR 2:1], 60 fps, 60 tbr, 60 tbn, 60 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x14a01e400] using SAR=1/1
[libx264 @ 0x14a01e400] using cpu capabilities: ARMv8 NEON
[libx264 @ 0x14a01e400] profile High 4:4:4 Predictive, level 3.1, 4:4:4, 8-bit
[libx264 @ 0x14a01e400] 264 - core 163 r3060 5db6aa6 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - 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=9 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, matroska, to 'image2.mkv':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Video: h264 (H264 / 0x34363248), yuvj444p(pc, bt470bg/unknown/unknown, progressive), 600x300 [SAR 254:254 DAR 2:1], q=2-31, 60 fps, 1k tbn
    Metadata:
      encoder         : Lavc58.134.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
frame=   60 fps=0.0 q=-1.0 Lsize=      26kB time=00:00:00.95 bitrate= 221.8kbits/s speed=13.7x    
video:25kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.316689%
[libx264 @ 0x14a01e400] frame I:1     Avg QP:22.02  size:   415
[libx264 @ 0x14a01e400] frame P:21    Avg QP:21.83  size:   617
[libx264 @ 0x14a01e400] frame B:38    Avg QP:26.79  size:   295
[libx264 @ 0x14a01e400] consecutive B-frames:  6.7% 10.0% 50.0% 33.3%
[libx264 @ 0x14a01e400] mb I  I16..4:  3.9% 93.9%  2.2%
[libx264 @ 0x14a01e400] mb P  I16..4:  2.0%  3.2%  1.7%  P16..4:  5.9%  3.4%  0.5%  0.0%  0.0%    skip:83.3%
[libx264 @ 0x14a01e400] mb B  I16..4:  1.1%  1.5%  0.3%  B16..8:  9.9%  2.0%  0.0%  direct: 0.0%  skip:85.2%  L0:58.0% L1:41.8% BI: 0.2%
[libx264 @ 0x14a01e400] 8x8 transform intra:61.5% inter:34.4%
[libx264 @ 0x14a01e400] coded y,u,v intra: 5.6% 4.4% 5.2% inter: 0.3% 0.3% 0.4%
[libx264 @ 0x14a01e400] i16 v,h,dc,p: 62% 34%  5%  0%
[libx264 @ 0x14a01e400] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23%  7% 67%  1%  0%  0%  0%  0%  0%
[libx264 @ 0x14a01e400] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 20% 41%  5%  2%  2%  2%  2%  1%
[libx264 @ 0x14a01e400] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x14a01e400] ref P L0: 43.2% 11.0% 31.0% 14.9%
[libx264 @ 0x14a01e400] ref B L0: 62.0% 28.3%  9.7%
[libx264 @ 0x14a01e400] ref B L1: 95.4%  4.6%
[libx264 @ 0x14a01e400] kb/s:196.69
Wrote video /var/folders/sc/q27bbsbn105gr0d08r3nd2jr0000gn/T/tmp.PU7y4SbK/image2.mkv
Reading frame rate of concat.mkv...
r_frame_rate=60/1
avg_frame_rate=60/1

Full reports for each run: 
/var/folders/sc/q27bbsbn105gr0d08r3nd2jr0000gn/T/tmp.PU7y4SbK/ffprobe-concat.log
/var/folders/sc/q27bbsbn105gr0d08r3nd2jr0000gn/T/tmp.PU7y4SbK/ffprobe-image2.log

Here are the two reports from the above run:

Last edited 5 years ago by Andre LaBranche (previous) (diff)

in reply to:  7 comment:8 by Cigaes, 5 years ago

Replying to Andre LaBranche:

The unwanted 25 fps does seem to be coming from concat. I tested that along with image2 and found that image2 honors the frame rate passed as a cli option.

image2 honors the frame_rate option, but you never gave that option to the image2 instances below the concat demuxer.

I would not oppose a patch to concat to add a time_base option.

comment:9 by Carl Eugen Hoyos, 4 years ago

Component: undeterminedavformat
Priority: normalwish
Type: defectenhancement
Version: unspecifiedgit-master

comment:10 by sycxyc, 2 years ago

Cc: sycxyc added

comment:11 by Brian, 15 months ago

Can reproduce.

 ffmpeg -version
ffmpeg version N-118926-gd435b641a2-20250325 Copyright (c) 2000-2025 the FFmpeg developers
built with gcc 14.2.0 (crosstool-NG 1.27.0.18_7458341)
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --enable-iconv --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-libxml2 --enable-lzma --enable-fontconfig --enable-libharfbuzz --enable-libvorbis --enable-opencl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --enable-vaapi --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-libplacebo --disable-libvvenc --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs=-lgomp --extra-ldflags=-pthread --extra-ldexeflags= --cc=x86_64-w64-mingw32-gcc --cxx=x86_64-w64-mingw32-g++ --ar=x86_64-w64-mingw32-gcc-ar --ranlib=x86_64-w64-mingw32-gcc-ranlib --nm=x86_64-w64-mingw32-gcc-nm --extra-version=20250325
libavutil      59. 60.100 / 59. 60.100
libavcodec     61. 33.102 / 61. 33.102
libavformat    61.  9.107 / 61.  9.107
libavdevice    61.  4.100 / 61.  4.100
libavfilter    10.  9.100 / 10.  9.100
libswscale      8. 13.103 /  8. 13.103
libswresample   5.  4.100 /  5.  4.100
libpostproc    58.  4.100 / 58.  4.100

 apngasm -v
APNG Assembler v3.1.1 (frontend v3.1.0)

 ffmpeg -hide_banner -loglevel error -filter_complex color=white:1x1,format=rgb24 -vframes 1 white-pixel.png

 $durations = @(
    120
    90
    90
    120
    90
    90
    90
    90
    120
    90
)

 apngasm ($durations | ForEach-Object { 'white-pixel.png'; $_ }) -o white-pixel-apngasm.apng
.\white-pixel.png => Delay=(120/1000) sec
.\white-pixel.png => Delay=(90/1000) sec
.\white-pixel.png => Delay=(90/1000) sec
.\white-pixel.png => Delay=(120/1000) sec
.\white-pixel.png => Delay=(90/1000) sec
.\white-pixel.png => Delay=(90/1000) sec
.\white-pixel.png => Delay=(90/1000) sec
.\white-pixel.png => Delay=(90/1000) sec
.\white-pixel.png => Delay=(120/1000) sec
.\white-pixel.png => Delay=(90/1000) sec
10 Frames
white-pixel-apngasm.apng
APNG assembled successfully => white-pixel-apngasm.apng

 "ffconcat version 1.0`n$(($durations | ForEach-Object { 'file white-pixel.png'; "duration $_`ms" }) -join "`n")" | Set-Content ffconcat.txt -NoNewline

 ffmpeg -hide_banner -loglevel trace -i ffconcat.txt -loop 0 white-pixel-ffmpeg.apng
Splitting the commandline.
Reading option '-hide_banner' ... matched as option 'hide_banner' (do not show program banner) with argument '1'.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'trace'.
Reading option '-i' ... matched as input url with argument 'ffconcat.txt'.
Reading option '-loop' ... matched as AVOption 'loop' with argument '0'.
Reading option 'white-pixel-ffmpeg.apng' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option hide_banner (do not show program banner) with argument 1.
Applying option loglevel (set logging level) with argument trace.
Successfully parsed a group of options.
Parsing a group of options: input url ffconcat.txt.
Successfully parsed a group of options.
Opening an input file: ffconcat.txt.
[AVFormatContext @ 0000000000149b40] Opening 'ffconcat.txt' for reading
[file @ 0000000000149f80] Setting default whitelist 'file,crypto,data'
Probing concat score:100 size:373
[concat @ 0000000000149b40] Format concat probed with size=2048 and score=100
[AVFormatContext @ 0000000000156140] Opening 'white-pixel.png' for reading
Probing image2 score:50 size:90
Probing png_pipe score:99 size:90
[png_pipe @ 0000000000156140] Format png_pipe probed with size=2048 and score=99
[png_pipe @ 0000000000156140] Before avformat_find_stream_info() pos: 0 bytes read:90 seeks:0 nb_streams:1
[png_pipe @ 0000000000156140] stream 0: start_time: NOPTS duration: NOPTS
[png_pipe @ 0000000000156140] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[png_pipe @ 0000000000156140] After avformat_find_stream_info() pos: 90 bytes read:90 seeks:0 frames:1
[concat @ 0000000000149b40] Before avformat_find_stream_info() pos: 373 bytes read:373 seeks:0 nb_streams:1
[concat @ 0000000000149b40] file:0 stream:0 pts:0 pts_time:0 dts:0 dts_time:0 -> pts:0 pts_time:0 dts:0 dts_time:0
[concat @ 0000000000149b40] All info found
[concat @ 0000000000149b40] stream 0: start_time: 0 duration: NOPTS
[concat @ 0000000000149b40] format: start_time: 0 duration: 0.99 (estimate from stream) bitrate=3 kb/s
[concat @ 0000000000149b40] After avformat_find_stream_info() pos: 373 bytes read:373 seeks:0 frames:1
Input #0, concat, from 'ffconcat.txt':
  Duration: 00:00:00.99, start: 0.000000, bitrate: 3 kb/s
  Stream #0:0, 1, 1/25: Video: png, 1 reference frame, rgb24(pc, gbr/unknown/unknown), 1x1 [SAR 1:1 DAR 1:1], 0/1, 25 fps, 25 tbr, 25 tbn
Successfully opened the file.
Parsing a group of options: output url white-pixel-ffmpeg.apng.
Successfully parsed a group of options.
Opening an output file: white-pixel-ffmpeg.apng.
[out#0/apng @ 0000000000104040] No explicit maps, mapping streams automatically...
[vost#0:0/apng @ 000000000014e600] Created video stream from input stream 0:0
detected 16 logical cores
[file @ 00000000001cb240] Setting default whitelist 'file,crypto,data'
Successfully opened the file.
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> apng (native))
[vost#0:0/apng @ 000000000014e600] Starting thread...
[vf#0:0 @ 00000000000e3840] Starting thread...
[vist#0:0/png @ 0000000000154740] [dec:png @ 000000000018a040] Starting thread...
[in#0/concat @ 0000000000149780] Starting thread...
Press [q] to stop, [?] for help
[AVIOContext @ 0000000000156640] Statistics: 90 bytes read, 0 seeks
[AVFormatContext @ 0000000000156140] Opening 'white-pixel.png' for reading
Probing image2 score:50 size:90
Probing png_pipe score:99 size:90
[png_pipe @ 0000000000156140] Format png_pipe probed with size=2048 and score=99
[png_pipe @ 0000000000156140] Before avformat_find_stream_info() pos: 0 bytes read:90 seeks:0 nb_streams:1
[png_pipe @ 0000000000156140] stream 0: start_time: NOPTS duration: NOPTS
[png_pipe @ 0000000000156140] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[png_pipe @ 0000000000156140] After avformat_find_stream_info() pos: 90 bytes read:90 seeks:0 frames:1
[concat @ 0000000000149b40] file:1 stream:0 pts:0 pts_time:0 dts:0 dts_time:0 -> pts:3 pts_time:0.12 dts:3 dts_time:0.12
[AVIOContext @ 0000000000156400] Statistics: 90 bytes read, 0 seeks
[AVFormatContext @ 0000000000156140] Opening 'white-pixel.png' for reading
Probing image2 score:50 size:90
Probing png_pipe score:99 size:90
[png_pipe @ 0000000000156140] Format png_pipe probed with size=2048 and score=99
[png_pipe @ 0000000000156140] Before avformat_find_stream_info() pos: 0 bytes read:90 seeks:0 nb_streams:1
[png_pipe @ 0000000000156140] stream 0: start_time: NOPTS duration: NOPTS
[png_pipe @ 0000000000156140] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[png_pipe @ 0000000000156140] After avformat_find_stream_info() pos: 90 bytes read:90 seeks:0 frames:1
[concat @ 0000000000149b40] file:2 stream:0 pts:0 pts_time:0 dts:0 dts_time:0 -> pts:5 pts_time:0.2 dts:5 dts_time:0.2
[AVIOContext @ 0000000000156400] Statistics: 90 bytes read, 0 seeks
[AVFormatContext @ 0000000000154a00] Opening 'white-pixel.png' for reading
Probing image2 score:50 size:90
Probing png_pipe score:99 size:90
[png_pipe @ 0000000000154a00] Format png_pipe probed with size=2048 and score=99
[png_pipe @ 0000000000154a00] Before avformat_find_stream_info() pos: 0 bytes read:90 seeks:0 nb_streams:1
[png_pipe @ 0000000000154a00] stream 0: start_time: NOPTS duration: NOPTS
[png_pipe @ 0000000000154a00] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[png_pipe @ 0000000000154a00] After avformat_find_stream_info() pos: 90 bytes read:90 seeks:0 frames:1
[concat @ 0000000000149b40] file:3 stream:0 pts:0 pts_time:0 dts:0 dts_time:0 -> pts:8 pts_time:0.32 dts:8 dts_time:0.32
[AVIOContext @ 0000000000156140] Statistics: 90 bytes read, 0 seeks
[AVFormatContext @ 0000000000154a00] Opening 'white-pixel.png' for reading
Probing image2 score:50 size:90
Probing png_pipe score:99 size:90
[png_pipe @ 0000000000154a00] Format png_pipe probed with size=2048 and score=99
[png_pipe @ 0000000000154a00] Before avformat_find_stream_info() pos: 0 bytes read:90 seeks:0 nb_streams:1
[png_pipe @ 0000000000154a00] stream 0: start_time: NOPTS duration: NOPTS
[png_pipe @ 0000000000154a00] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[png_pipe @ 0000000000154a00] After avformat_find_stream_info() pos: 90 bytes read:90 seeks:0 frames:1
[concat @ 0000000000149b40] file:4 stream:0 pts:0 pts_time:0 dts:0 dts_time:0 -> pts:11 pts_time:0.44 dts:11 dts_time:0.44
[AVIOContext @ 0000000000156140] Statistics: 90 bytes read, 0 seeks
[AVFormatContext @ 00000000049a5c00] Opening 'white-pixel.png' for reading
Probing image2 score:50 size:90
Probing png_pipe score:99 size:90
[png_pipe @ 00000000049a5c00] Format png_pipe probed with size=2048 and score=99
[png_pipe @ 00000000049a5c00] Before avformat_find_stream_info() pos: 0 bytes read:90 seeks:0 nb_streams:1
[png_pipe @ 00000000049a5c00] stream 0: start_time: NOPTS duration: NOPTS
[png_pipe @ 00000000049a5c00] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[png_pipe @ 00000000049a5c00] After avformat_find_stream_info() pos: 90 bytes read:90 seeks:0 frames:1
[concat @ 0000000000149b40] file:5 stream:0 pts:0 pts_time:0 dts:0 dts_time:0 -> pts:13 pts_time:0.52 dts:13 dts_time:0.52
[AVIOContext @ 0000000000156140] Statistics: 90 bytes read, 0 seeks
[AVFormatContext @ 00000000049a5cc0] Opening 'white-pixel.png' for reading
Probing image2 score:50 size:90
Probing png_pipe score:99 size:90
[png_pipe @ 00000000049a5cc0] Format png_pipe probed with size=2048 and score=99
[png_pipe @ 00000000049a5cc0] Before avformat_find_stream_info() pos: 0 bytes read:90 seeks:0 nb_streams:1
[png_pipe @ 00000000049a5cc0] stream 0: start_time: NOPTS duration: NOPTS
[png_pipe @ 00000000049a5cc0] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[png_pipe @ 00000000049a5cc0] After avformat_find_stream_info() pos: 90 bytes read:90 seeks:0 frames:1
[concat @ 0000000000149b40] file:6 stream:0 pts:0 pts_time:0 dts:0 dts_time:0 -> pts:15 pts_time:0.6 dts:15 dts_time:0.6
[AVIOContext @ 0000000000156140] Statistics: 90 bytes read, 0 seeks
[AVFormatContext @ 000000000014d8c0] Opening 'white-pixel.png' for reading
Probing image2 score:50 size:90
Probing png_pipe score:99 size:90
[png_pipe @ 000000000014d8c0] Format png_pipe probed with size=2048 and score=99
[png_pipe @ 000000000014d8c0] Before avformat_find_stream_info() pos: 0 bytes read:90 seeks:0 nb_streams:1
[png_pipe @ 000000000014d8c0] stream 0: start_time: NOPTS duration: NOPTS
[png_pipe @ 000000000014d8c0] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[png_pipe @ 000000000014d8c0] After avformat_find_stream_info() pos: 90 bytes read:90 seeks:0 frames:1
[concat @ 0000000000149b40] file:7 stream:0 pts:0 pts_time:0 dts:0 dts_time:0 -> pts:17 pts_time:0.68 dts:17 dts_time:0.68
[AVIOContext @ 0000000000156140] Statistics: 90 bytes read, 0 seeks
[AVFormatContext @ 000000000014d8c0] Opening 'white-pixel.png' for reading
Probing image2 score:50 size:90
Probing png_pipe score:99 size:90
[png_pipe @ 000000000014d8c0] Format png_pipe probed with size=2048 and score=99
[png_pipe @ 000000000014d8c0] Before avformat_find_stream_info() pos: 0 bytes read:90 seeks:0 nb_streams:1
[png_pipe @ 000000000014d8c0] stream 0: start_time: NOPTS duration: NOPTS
[png_pipe @ 000000000014d8c0] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[png_pipe @ 000000000014d8c0] After avformat_find_stream_info() pos: 90 bytes read:90 seeks:0 frames:1
[concat @ 0000000000149b40] file:8 stream:0 pts:0 pts_time:0 dts:0 dts_time:0 -> pts:20 pts_time:0.8 dts:20 dts_time:0.8
[AVIOContext @ 0000000000156140] Statistics: 90 bytes read, 0 seeks
[AVFormatContext @ 000000000014da00] Opening 'white-pixel.png' for reading
Probing image2 score:50 size:90
Probing png_pipe score:99 size:90
[png_pipe @ 000000000014da00] Format png_pipe probed with size=2048 and score=99
[png_pipe @ 000000000014da00] Before avformat_find_stream_info() pos: 0 bytes read:90 seeks:0 nb_streams:1
[png_pipe @ 000000000014da00] stream 0: start_time: NOPTS duration: NOPTS
[png_pipe @ 000000000014da00] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[png_pipe @ 000000000014da00] After avformat_find_stream_info() pos: 90 bytes read:90 seeks:0 frames:1
[concat @ 0000000000149b40] file:9 stream:0 pts:0 pts_time:0 dts:0 dts_time:0 -> pts:23 pts_time:0.92 dts:23 dts_time:0.92
[in#0/concat @ 0000000000149780] EOF while reading input
[in#0/concat @ 0000000000149780] Terminating thread with return code 0 (success)
[vist#0:0/png @ 0000000000154740] [dec:png @ 000000000018a040] Decoder thread received EOF packet
[graph -1 input from stream 0:0 @ 0000000000102a00] w:1 h:1 pixfmt:rgb24 tb:1/25 fr:25/1 sar:1/1 csp:gbr range:pc
[format @ 0000000000102e40] Setting 'pix_fmts' to value 'rgb24|rgba|rgb48be|rgba64be|pal8|gray|ya8|gray16be|ya16be'
[AVFilterGraph @ 000000000499aac0] query_formats: 4 queried, 9 merged, 0 already done, 0 delayed
Output #0, apng, to 'white-pixel-ffmpeg.apng':
  Metadata:
    encoder         : Lavf61.9.107
  Stream #0:0, 0, 1/25: Video: apng, 1 reference frame, rgb24(pc, gbr/unknown/unknown, progressive), 1x1 [SAR 1:1 DAR 1:1], 0/1, q=2-31, 200 kb/s, 25 fps, 25 tbn
    Metadata:
      encoder         : Lavc61.33.102 apng
[out#0/apng @ 0000000000104040] Starting thread...
[vist#0:0/png @ 0000000000154740] [dec:png @ 000000000018a040] Decoder returned EOF, finishing
[vist#0:0/png @ 0000000000154740] [dec:png @ 000000000018a040] Terminating thread with return code 0 (success)
[out_#0:0 @ 00000000001025c0] EOF on sink link out_#0:0:default.
[vf#0:0 @ 00000000000e3840] Filtergraph returned EOF, finishing
[vf#0:0 @ 00000000000e3840] All consumers returned EOF
[vost#0:0/apng @ 000000000014e600] [enc:apng @ 0000000000150740] Encoder thread received EOF
[vost#0:0/apng @ 000000000014e600] Terminating thread with return code 0 (success)
[out#0/apng @ 0000000000104040] All streams finished
[out#0/apng @ 0000000000104040] Terminating thread with return code 0 (success)
[vf#0:0 @ 00000000000e3840] Terminating thread with return code 0 (success)
[AVIOContext @ 0000000004970100] Statistics: 742 bytes written, 1 seeks, 1 writeouts
[out#0/apng @ 0000000000104040] Output file #0 (white-pixel-ffmpeg.apng):
[out#0/apng @ 0000000000104040]   Output stream #0:0 (video): 10 frames encoded; 10 packets muxed (656 bytes);
[out#0/apng @ 0000000000104040]   Total: 10 packets (656 bytes) muxed
[out#0/apng @ 0000000000104040] video:1KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 13.109756%
frame=   10 fps=0.0 q=-0.0 Lsize=       1KiB time=00:00:00.96 bitrate=   6.2kbits/s speed=62.9x
[in#0/concat @ 0000000000149780] Input file #0 (ffconcat.txt):
[in#0/concat @ 0000000000149780]   Input stream #0:0 (video): 10 packets read (900 bytes); 10 frames decoded; 0 decode errors;
[in#0/concat @ 0000000000149780]   Total: 10 packets (900 bytes) demuxed
[AVIOContext @ 0000000000156140] Statistics: 90 bytes read, 0 seeks
[AVIOContext @ 0000000000155900] Statistics: 373 bytes read, 0 seeks

 ffprobe -hide_banner -loglevel error -show_frames -i white-pixel-ffmpeg.apng | rg 'duration_time=\K[\d.]+' -oP
0.120000
0.080000
0.120000
0.120000
0.080000
0.080000
0.080000
0.120000
0.120000
0.120000

 ffprobe -hide_banner -loglevel error -show_frames -i white-pixel-apngasm.apng | rg 'duration_time=\K[\d.]+' -oP
0.120000
0.090000
0.090000
0.120000
0.090000
0.090000
0.090000
0.090000
0.120000
0.090000

I also found that for some reason the last frame has a good bit of delay added to it, regardless of whether or not ffconcat's used (I believe there's already an open ticket for this). What's odd's that other frames also exhibit a bit of frametime variance here.

 ffmpeg -hide_banner -loglevel trace -i white-pixel-apngasm.apng -loop 0 white-pixel-apngasm-to-ffmpeg.apng
Splitting the commandline.
Reading option '-hide_banner' ... matched as option 'hide_banner' (do not show program banner) with argument '1'.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'trace'.
Reading option '-i' ... matched as input url with argument 'white-pixel-apngasm.apng'.
Reading option '-loop' ... matched as AVOption 'loop' with argument '0'.
Reading option 'white-pixel-apngasm-to-ffmpeg.apng' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option hide_banner (do not show program banner) with argument 1.
Applying option loglevel (set logging level) with argument trace.
Successfully parsed a group of options.
Parsing a group of options: input url white-pixel-apngasm.apng.
Successfully parsed a group of options.
Opening an input file: white-pixel-apngasm.apng.
[AVFormatContext @ 000000000070fc00] Opening 'white-pixel-apngasm.apng' for reading
[file @ 0000000000710040] Setting default whitelist 'file,crypto,data'
Probing apng score:100 size:754
Probing png_pipe score:99 size:754
[apng @ 000000000070fc00] Format apng probed with size=2048 and score=100
[apng @ 000000000070fc00] num_frames: 10, num_play: 0
[apng @ 000000000070fc00] Before avformat_find_stream_info() pos: 67 bytes read:754 seeks:0 nb_streams:1
[apng @ 000000000070fc00] decode_fctl_chunk: sequence_number: 0, width: 1, height: 1, x_offset: 0, y_offset: 0, delay_num: 120, delay_den: 1000, dispose_op: 0, blend_op: 0
[apng @ 000000000070fc00] decode_fctl_chunk: sequence_number: 1, width: 1, height: 1, x_offset: 0, y_offset: 0, delay_num: 90, delay_den: 1000, dispose_op: 0, blend_op: 0
[apng @ 000000000070fc00] decode_fctl_chunk: sequence_number: 3, width: 1, height: 1, x_offset: 0, y_offset: 0, delay_num: 90, delay_den: 1000, dispose_op: 0, blend_op: 0
[apng @ 000000000070fc00] decode_fctl_chunk: sequence_number: 5, width: 1, height: 1, x_offset: 0, y_offset: 0, delay_num: 120, delay_den: 1000, dispose_op: 0, blend_op: 0
[apng @ 000000000070fc00] decode_fctl_chunk: sequence_number: 7, width: 1, height: 1, x_offset: 0, y_offset: 0, delay_num: 90, delay_den: 1000, dispose_op: 0, blend_op: 0
[apng @ 000000000070fc00] decode_fctl_chunk: sequence_number: 9, width: 1, height: 1, x_offset: 0, y_offset: 0, delay_num: 90, delay_den: 1000, dispose_op: 0, blend_op: 0
[apng @ 000000000070fc00] decode_fctl_chunk: sequence_number: 11, width: 1, height: 1, x_offset: 0, y_offset: 0, delay_num: 90, delay_den: 1000, dispose_op: 0, blend_op: 0
[apng @ 000000000070fc00] decode_fctl_chunk: sequence_number: 13, width: 1, height: 1, x_offset: 0, y_offset: 0, delay_num: 90, delay_den: 1000, dispose_op: 0, blend_op: 0
[apng @ 000000000070fc00] decode_fctl_chunk: sequence_number: 15, width: 1, height: 1, x_offset: 0, y_offset: 0, delay_num: 120, delay_den: 1000, dispose_op: 0, blend_op: 0
[apng @ 000000000070fc00] decode_fctl_chunk: sequence_number: 17, width: 1, height: 1, x_offset: 0, y_offset: 0, delay_num: 90, delay_den: 1000, dispose_op: 0, blend_op: 0
[apng @ 000000000070fc00] rfps: 9.916667 0.019617
[apng @ 000000000070fc00] rfps: 10.000000 0.015556
[apng @ 000000000070fc00] rfps: 10.083333 0.012358
[apng @ 000000000070fc00] rfps: 10.166667 0.010023
[apng @ 000000000070fc00] rfps: 10.250000 0.008551
[apng @ 000000000070fc00] rfps: 10.333333 0.007943
    Last message repeated 1 times
[apng @ 000000000070fc00] rfps: 10.416667 0.008198
    Last message repeated 1 times
[apng @ 000000000070fc00] rfps: 10.500000 0.009317
    Last message repeated 1 times
[apng @ 000000000070fc00] rfps: 10.583333 0.011298
[apng @ 000000000070fc00] rfps: 10.666667 0.014143
[apng @ 000000000070fc00] rfps: 10.750000 0.017851
[apng @ 000000000070fc00] rfps: 22.583333 0.017851
[apng @ 000000000070fc00] rfps: 22.666667 0.014143
[apng @ 000000000070fc00] rfps: 22.750000 0.011298
[apng @ 000000000070fc00] rfps: 22.833333 0.009317
    Last message repeated 1 times
[apng @ 000000000070fc00] rfps: 22.916667 0.008198
    Last message repeated 1 times
[apng @ 000000000070fc00] rfps: 23.000000 0.007943
    Last message repeated 1 times
[apng @ 000000000070fc00] rfps: 23.083333 0.008551
[apng @ 000000000070fc00] rfps: 23.166667 0.010023
[apng @ 000000000070fc00] rfps: 23.250000 0.012358
[apng @ 000000000070fc00] rfps: 23.333333 0.015556
[apng @ 000000000070fc00] rfps: 23.416667 0.019617
[apng @ 000000000070fc00] rfps: 33.000000 0.006906
    Last message repeated 1 times
[apng @ 000000000070fc00] rfps: 44.000000 0.014143
[apng @ 000000000070fc00] rfps: 56.000000 0.014143
[apng @ 000000000070fc00] stream 0: start_time: NOPTS duration: NOPTS
[apng @ 000000000070fc00] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s
[apng @ 000000000070fc00] After avformat_find_stream_info() pos: 742 bytes read:754 seeks:0 frames:10
Input #0, apng, from 'white-pixel-apngasm.apng':
  Duration: N/A, bitrate: N/A
  Stream #0:0, 10, 1/100000: Video: apng, 1 reference frame, ya8(pc, gbr/unknown/unknown), 1x1, 0/1, 10.25 fps, 33 tbr, 100k tbn
Successfully opened the file.
Parsing a group of options: output url white-pixel-apngasm-to-ffmpeg.apng.
Successfully parsed a group of options.
Opening an output file: white-pixel-apngasm-to-ffmpeg.apng.
[out#0/apng @ 00000000006ccfc0] No explicit maps, mapping streams automatically...
[vost#0:0/apng @ 0000000000713b40] Created video stream from input stream 0:0
detected 16 logical cores
[file @ 00000000006b9bc0] Setting default whitelist 'file,crypto,data'
Successfully opened the file.
Stream mapping:
  Stream #0:0 -> #0:0 (apng (native) -> apng (native))
[vost#0:0/apng @ 0000000000713b40] Starting thread...
[vf#0:0 @ 00000000006d0280] Starting thread...
[vist#0:0/apng @ 0000000000715140] [dec:apng @ 0000000000714440] Starting thread...
[in#0/apng @ 000000000070f940] Starting thread...
Press [q] to stop, [?] for help
[in#0/apng @ 000000000070f940] EOF while reading input
[in#0/apng @ 000000000070f940] Terminating thread with return code 0 (success)
[vist#0:0/apng @ 0000000000715140] [dec:apng @ 0000000000714440] Decoder thread received EOF packet
[graph -1 input from stream 0:0 @ 000000000078e500] w:1 h:1 pixfmt:ya8 tb:1/100000 fr:33/1 sar:0/1 csp:gbr range:pc
[format @ 000000000078f1c0] Setting 'pix_fmts' to value 'rgb24|rgba|rgb48be|rgba64be|pal8|gray|ya8|gray16be|ya16be'
[AVFilterGraph @ 000000000078b980] query_formats: 4 queried, 9 merged, 0 already done, 0 delayed
Output #0, apng, to 'white-pixel-apngasm-to-ffmpeg.apng':
  Metadata:
    encoder         : Lavf61.9.107
  Stream #0:0, 0, 1/33: Video: apng, 1 reference frame, ya8(pc, gbr/unknown/unknown, progressive), 1x1, 0/1, q=2-31, 200 kb/s, 33 fps, 33 tbn
    Metadata:
      encoder         : Lavc61.33.102 apng
[out#0/apng @ 00000000006ccfc0] Starting thread...
[vist#0:0/apng @ 0000000000715140] [dec:apng @ 0000000000714440] Decoder returned EOF, finishing
[vist#0:0/apng @ 0000000000715140] [dec:apng @ 0000000000714440] Terminating thread with return code 0 (success)
[out_#0:0 @ 000000000078e840] EOF on sink link out_#0:0:default.
[vf#0:0 @ 00000000006d0280] Filtergraph returned EOF, finishing
[vf#0:0 @ 00000000006d0280] All consumers returned EOF
[vost#0:0/apng @ 0000000000713b40] [enc:apng @ 0000000000718b40] Encoder thread received EOF
[vost#0:0/apng @ 0000000000713b40] Terminating thread with return code 0 (success)
[out#0/apng @ 00000000006ccfc0] All streams finished
[vf#0:0 @ 00000000006d0280] Terminating thread with return code 0 (success)
[out#0/apng @ 00000000006ccfc0] Terminating thread with return code 0 (success)
[AVIOContext @ 000000000076ce40] Statistics: 732 bytes written, 1 seeks, 1 writeouts
[out#0/apng @ 00000000006ccfc0] Output file #0 (white-pixel-apngasm-to-ffmpeg.apng):
[out#0/apng @ 00000000006ccfc0]   Output stream #0:0 (video): 10 frames encoded; 10 packets muxed (646 bytes);
[out#0/apng @ 00000000006ccfc0]   Total: 10 packets (646 bytes) muxed
[out#0/apng @ 00000000006ccfc0] video:1KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 13.312693%
frame=   10 fps=0.0 q=-0.0 Lsize=       1KiB time=00:00:01.00 bitrate=   5.9kbits/s speed= 171x
[in#0/apng @ 000000000070f940] Input file #0 (white-pixel-apngasm.apng):
[in#0/apng @ 000000000070f940]   Input stream #0:0 (video): 10 packets read (675 bytes); 10 frames decoded; 0 decode errors;
[in#0/apng @ 000000000070f940]   Total: 10 packets (675 bytes) demuxed
[AVIOContext @ 0000000000713140] Statistics: 754 bytes read, 0 seeks

 ffprobe -hide_banner -loglevel error -show_frames -i white-pixel-apngasm-to-ffmpeg.apng | rg 'duration_time=\K[\d.]+' -oP
0.121210
0.090910
0.090910
0.121210
0.090910
0.090910
0.090910
0.090910
0.121210
0.121210

comment:12 by MasterQuestionable, 15 months ago

Analyzed by developer: set
Cc: MasterQuestionable added
Priority: wishnormal
Summary: Concat images produces wrong timings when duration is in millisecondsMalapropos timebase preset for "concat" demuxer?
Type: enhancementdefect
Note: See TracTickets for help on using tickets.