Opened 8 months ago

#10551 new defect

When copying chapters to an ogg file 1 second is added to the timestamp of some chapters

Reported by: giwiniswut Owned by:
Priority: normal Component: ffmpeg
Version: 6.0 Keywords:
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

Summary of the bug:
While converting a chaptered m4a (aac) audio to ogg (opus) I noticed that some chapters were off by one second, exactly. The decimal points are intact, the second timestamp has exactly 1s added onto it.
While converting, ffmpeg prints the correct timestamps. When taking a look at the resulting file after conversion is done the timestamps are off.
I do not see an obvious pattern as per which chapters are affected.

Things work as expected if chapter information is manually converted to vorbiscomment chapter tags. (If that's what they're called, what I'm trying to refer to is this style of chapters in ffmetadata:)
CHAPTER000=00:00:00.000
CHAPTER000NAME=Chapter 1
CHAPTER001=00:00:01.000
CHAPTER001NAME=Chapter 2
[...]
FFmpeg & mpv properly pick up the chapters in this case.

How to reproduce:

# Note: source.m4a is omitted, chapter information from ffmetadata.txt is attached instead.
#       The issue is reproducible with that file alone.
% ffmpeg -i source.m4a -map_metadata 0:s -f ffmetadata ffmetadata.txt
% LENGTH='04:01:42.32'  # duration of source.m4a as reported in previous output
% ffmpeg -f lavfi -i anullsrc -i ffmetadata.txt -map_chapters 1 -t "$LENGTH" ffmetadata.opus
% ffmpeg -i ffmetadata.opus -map_metadata 0:s -f ffmetadata ffmetadata.opus.reexport.txt
% diff ffmetadata.txt ffmetadata.opus.reexport.txt
==> Some chapters are off by 1s. The last END tag is adjusted to the precise length of the new file.

# Note: resulting chapters.txt file is attached
% echo ";FFMETADATA1" >chapters.txt
% ffprobe -v error -of default=noprint_wrappers=1 -show_entries chapters source.m4a \
  | while read -r line; do
      tt="${line#TAG:title=}"
      if [ "$tt" = "$line" ]; then
          eval $line
      else
          stmp=$(date --date="@$start_time" --utc +'%T.%3N')
          printf 'CHAPTER%03d=%s\nCHAPTER%03dNAME=Chapter %d\n' $id "$stmp" $id $((id+1))
      fi
    done >>chapters.txt
% ffmpeg -f lavfi -i anullsrc -i chapters.txt -map_metadata 1 -t "$LENGTH" chapters.opus
% ffmpeg -i chapters.opus -map_metadata 0:s -f ffmetadata chapters.opus.reexport.txt
% diff ffmetadata.txt chapters.opus.reexport.txt
==> All chapters are correct. Only the last END tag is adjusted to the precise length of the new file.


ffmpeg version 2:6.0-9 as packaged by Arch Linux https://archlinux.org/packages/extra/x86_64/ffmpeg/
built on 2023-09-05 17:55 UTC

ffmpeg version git+release/6.0@3d5edb89e75fe3ab3a6757208ef121fa2b0f54c7
commit date 2023-08-08 17:41:20 UTC

Attachments (2)

ffmetadata.txt (2.3 KB ) - added by giwiniswut 8 months ago.
Chapter information from source.m4a
chapters.txt (1.7 KB ) - added by giwiniswut 8 months ago.
Converted chapter information

Download all attachments as: .zip

Change History (2)

by giwiniswut, 8 months ago

Attachment: ffmetadata.txt added

Chapter information from source.m4a

by giwiniswut, 8 months ago

Attachment: chapters.txt added

Converted chapter information

Note: See TracTickets for help on using tickets.