#8464 closed defect (invalid)
`outpoint` directive of `concat` demuxer may be off by 1 frame
Reported by: | gdgsdg123 | Owned by: | |
---|---|---|---|
Priority: | normal | Component: | avformat |
Version: | git-master | Keywords: | concat |
Cc: | Blocked By: | ||
Blocking: | Reproduced by developer: | no | |
Analyzed by developer: | no |
Description
X.txt:
file 'merge.avi' inpoint 87.05 outpoint 88.116667
ffmpeg -y -f concat -safe 0 -i "X.txt" -c copy "temp.avi"
ffmpeg version git-2020-01-02-81172b5 Copyright (c) 2000-2020 the FFmpeg developers built with gcc 9.2.1 (GCC) 20191125 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf libavutil 56. 38.100 / 56. 38.100 libavcodec 58. 65.102 / 58. 65.102 libavformat 58. 35.101 / 58. 35.101 libavdevice 58. 9.102 / 58. 9.102 libavfilter 7. 70.101 / 7. 70.101 libswscale 5. 6.100 / 5. 6.100 libswresample 3. 6.100 / 3. 6.100 libpostproc 55. 6.100 / 55. 6.100 [avi @ 00000000003ca900] decoding for stream 0 failed Input #0, concat, from 'X.txt': Duration: 00:00:01.07, bitrate: 0 kb/s Stream #0:0: Video: h264 (High 4:4:4 Intra) (H264 / 0x34363248), gbrp(tv, gbr/unknown/unknown, progressive), 1920x1080, 377584 kb/s, 60 fps, 30 tbr, 60 tbn, 120 tbc Output #0, avi, to 'temp.avi': Metadata: ISFT : Lavf58.35.101 Stream #0:0: Video: h264 (High 4:4:4 Intra) (H264 / 0x34363248), gbrp(tv, gbr/unknown/unknown, progressive), 1920x1080, q=2-31, 377584 kb/s, 60 fps, 30 tbr, 60 tbn, 60 tbc Stream mapping: Stream #0:0 -> #0:0 (copy) Press [q] to stop, [?] for help [avi @ 00000000003cf100] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly frame= 33 fps=0.0 q=-1.0 Lsize= 96767kB time=00:00:01.08 bitrate=731740.7kbits/s speed=8.74x video:96760kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.007367%
The frame at outpoint
is included, while according to the documentation it shouldn't... And the behavior is inconsistent with different timestamp values.
ffmpeg -ss 87.05 -to 88.116667 -i "merge.avi" -an -c copy "to.avi"
ffmpeg version git-2020-01-02-81172b5 Copyright (c) 2000-2020 the FFmpeg developers built with gcc 9.2.1 (GCC) 20191125 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf libavutil 56. 38.100 / 56. 38.100 libavcodec 58. 65.102 / 58. 65.102 libavformat 58. 35.101 / 58. 35.101 libavdevice 58. 9.102 / 58. 9.102 libavfilter 7. 70.101 / 7. 70.101 libswscale 5. 6.100 / 5. 6.100 libswresample 3. 6.100 / 3. 6.100 libpostproc 55. 6.100 / 55. 6.100 [avi @ 00000000006504c0] decoding for stream 0 failed Input #0, avi, from 'merge.avi': Metadata: encoder : Lavf58.29.100 Duration: 00:05:24.67, start: 0.000000, bitrate: 377573 kb/s Stream #0:0: Video: h264 (High 4:4:4 Intra) (H264 / 0x34363248), gbrp(tv, gbr/unknown/unknown, progressive), 1920x1080, 377584 kb/s, 60 fps, 30 tbr, 60 tbn, 120 tbc Output #0, avi, to 'to.avi': Metadata: ISFT : Lavf58.35.101 Stream #0:0: Video: h264 (High 4:4:4 Intra) (H264 / 0x34363248), gbrp(tv, gbr/unknown/unknown, progressive), 1920x1080, q=2-31, 377584 kb/s, 60 fps, 30 tbr, 60 tbn, 60 tbc Stream mapping: Stream #0:0 -> #0:0 (copy) Press [q] to stop, [?] for help [avi @ 000000000315c900] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly frame= 32 fps=0.0 q=-1.0 Lsize= 93969kB time=00:00:01.05 bitrate=733139.1kbits/s speed=9.13x video:93962kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.007536%
This approach seemed to produce a reliable output with various -to
values tried. (not intensively tested)
For obvious reason I'm not gonna upload the "merge.avi"... But I believe the problem can be reproduced with different input and timestamp values.
Attachments (1)
Change History (7)
comment:1 by , 5 years ago
Component: | undetermined → avformat |
---|---|
Keywords: | concat added |
Resolution: | → needs_more_info |
Status: | new → closed |
by , 5 years ago
Modified "merge.avi" that can be used to reproduce the problem. (with the original commands)
comment:2 by , 5 years ago
Resolution: | needs_more_info |
---|---|
Status: | closed → reopened |
Seems only the timestamps matter...
follow-up: 4 comment:3 by , 5 years ago
Resolution: | → invalid |
---|---|
Status: | reopened → closed |
This is a simple timestamp precision issue. Input file is 60 fps, therefore the timestamp of the last frame is *exactly* 5287/60 which is 88.116666666666 (infinite number of sixes), which is indeed smaller then the outpoint you specified 88.116667 therefore the last frame is not included. I suggest you round upwards when you specify the outpoint.
comment:4 by , 5 years ago
Type: | defect → enhancement |
---|
Replying to cus:
This is a simple timestamp precision issue. Input file is 60 fps, therefore the timestamp of the last frame is *exactly* 5287/60 which is 88.116666666666 (infinite number of sixes), which is indeed smaller then the outpoint you specified 88.116667 therefore the last frame is included.
Maybe invalid but it doesn't answer the real question...
As those are values reported by FFprobe.
ffprobe -hide_banner -show_entries "frame" -select_streams v:0 -of "xml" "temp.avi"ffprobe -hide_banner -show_entries "frame=best_effort_timestamp_time" -select_streams v:0 -of "compact=nk=1:p=0" "temp.avi"
Replying to cus:
I suggest you round downwards when you specify the outpoint if you dont want to include the frame at outpoint.
This approach seemed to produce a reliable output with various outpoint
values tried. (not intensively tested)
comment:5 by , 5 years ago
Resolution: | invalid → worksforme |
---|
The "merge.avi" also serves as a good example for testing the cutting accuracy.
The file is entirely composed of "Black Screen" frames with only 3 exceptions:
Frame Number | Presentation Timestamp | Duration | Content |
---|---|---|---|
564 | 87.05 | 0.033333 | Yellow |
595 | 88.083333 | 0.033334 | Green |
596 | 88.116667 | N/A | Red |
Which resemble all 3 possible outcomes: on point, early, late.
Another thing: possible 0 frame output (null segment) without warning...
X.txt:
file 'merge.avi' inpoint 87.05 outpoint 87.05
ffmpeg -y -f concat -safe 0 -i "X.txt" -c copy "temp.avi"
ffmpeg version git-2020-01-10-3d894db Copyright (c) 2000-2020 the FFmpeg developers built with gcc 9.2.1 (GCC) 20191125 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf libavutil 56. 38.100 / 56. 38.100 libavcodec 58. 65.103 / 58. 65.103 libavformat 58. 35.101 / 58. 35.101 libavdevice 58. 9.103 / 58. 9.103 libavfilter 7. 70.101 / 7. 70.101 libswscale 5. 6.100 / 5. 6.100 libswresample 3. 6.100 / 3. 6.100 libpostproc 55. 6.100 / 55. 6.100 Input #0, concat, from 'X.txt': Duration: 00:00:00.00, bitrate: N/A Stream #0:0: Video: h264 (High 4:4:4 Intra) (H264 / 0x34363248), gbrp(tv, gbr/unknown/unknown, progressive), 256x144, 60 fps, 30 tbr, 60 tbn, 60 tbc Output #0, avi, to 'temp.avi': Metadata: ISFT : Lavf58.35.101 Stream #0:0: Video: h264 (High 4:4:4 Intra) (H264 / 0x34363248), gbrp(tv, gbr/unknown/unknown, progressive), 256x144, q=2-31, 60 fps, 30 tbr, 60 tbn, 60 tbc Stream mapping: Stream #0:0 -> #0:0 (copy) Press [q] to stop, [?] for help frame= 0 fps=0.0 q=-1.0 Lsize= 6kB time=00:00:00.00 bitrate=N/A speed= 0x video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
ffmpeg -ss 87.05 -to 87.05 -i "merge.avi" -an -c copy "to.avi"
ffmpeg version git-2020-01-10-3d894db Copyright (c) 2000-2020 the FFmpeg developers built with gcc 9.2.1 (GCC) 20191125 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf libavutil 56. 38.100 / 56. 38.100 libavcodec 58. 65.103 / 58. 65.103 libavformat 58. 35.101 / 58. 35.101 libavdevice 58. 9.103 / 58. 9.103 libavfilter 7. 70.101 / 7. 70.101 libswscale 5. 6.100 / 5. 6.100 libswresample 3. 6.100 / 3. 6.100 libpostproc 55. 6.100 / 55. 6.100 -to value smaller than -ss; aborting.
The inpoint
/-ss
, outpoint
/-to
values must be carefully chosen.
Off-Topic
When using concat
demuxer, explicitly specifying duration
is usually necessary.
And is it yet possible to instruct FFmpeg to report the number of frames of each segment?
comment:6 by , 5 years ago
Resolution: | worksforme → invalid |
---|---|
Type: | enhancement → defect |
Please reopen this ticket if you can provide an input sample file.