[FFmpeg-trac] #5415(undetermined:new): Incorrect timestamps when using seek OR segment muxer for mp4

FFmpeg trac at avcodec.org
Fri Apr 8 16:18:05 CEST 2016


#5415: Incorrect timestamps when using seek OR segment muxer for mp4
-------------------------------------+-------------------------------------
             Reporter:  stefan.moro  |                     Type:  defect
               Status:  new          |                 Priority:  normal
            Component:               |                  Version:  git-
  undetermined                       |  master
             Keywords:               |               Blocked By:
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------
 Hi,

 According to https://trac.ffmpeg.org/wiki/Seeking#Cuttingsmallsections it
 should be possible to cut a part of an e.g. mp4 file and keep the original
 timestamps (using copyts).
 Also, it should be possible to segment an e.g. mp4 and keep original
 timestamps using the segment muxer.

 Both of these fail to keep original timestamp for me for the attached
 sample file.

 The reason I created one ticket for both issues is that I get the exact
 same mismatch in the timestamps so it seems it the same issue causing
 both.

 What I want to do is to cut from 9 seconds to ~18 seconds in the sample
 file, creating a new file and keeping the original timestamps.

 Given the timestamps in the original file, that would mean keeping packets
 with PTS '''432128''' (9.00267 s) to PTS '''863232''' (17.984000 s)
 (Inspected using ffprobe -show_packets).

 Both commands below achieves almost that, except that PTS is shifted by
 -32 in the given timescale. I get first PTS '''432096''' (9.002000 s) and
 last PTS '''863200''' (17.983333 s). Also I get a negative duration on the
 last packet '''-431072''' (-8.980667 s) whereas all other packets seem to
 have correct duration.

 Output with the seek approach:
 {{{
 root at bf6643488050:# ffmpeg -v debug -y -ss 9.002667 -i aac_lc.mp4 -to 18
 -flags +global_header -codec copy -copyts seek.mp4
 ffmpeg version N-79258-g3a9611d Copyright (c) 2000-2016 the FFmpeg
 developers
   built with gcc 5.2.1 (Ubuntu 5.2.1-22ubuntu2) 20151010
   configuration: --prefix=/tmp/tmp_build_dir --pkg-config-flags=--static
 --extra-cflags=-I/tmp/tmp_build_dir/include --extra-
 ldflags=-L/tmp/tmp_build_dir/lib --bindir=/root/bin --enable-gpl --enable-
 nonfree --enable-libx264 --enable-libsoxr --enable-libfdk-aac
   libavutil      55. 20.100 / 55. 20.100
   libavcodec     57. 34.100 / 57. 34.100
   libavformat    57. 31.100 / 57. 31.100
   libavdevice    57.  0.101 / 57.  0.101
   libavfilter     6. 41.100 /  6. 41.100
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  0.101 /  2.  0.101
   libpostproc    54.  0.100 / 54.  0.100
 Splitting the commandline.
 Reading option '-v' ... matched as option 'v' (set logging level) with
 argument 'debug'.
 Reading option '-y' ... matched as option 'y' (overwrite output files)
 with argument '1'.
 Reading option '-ss' ... matched as option 'ss' (set the start time
 offset) with argument '9.002667'.
 Reading option '-i' ... matched as input file with argument 'aac_lc.mp4'.
 Reading option '-to' ... matched as option 'to' (record or transcode stop
 time) with argument '18'.
 Reading option '-flags' ... matched as AVOption 'flags' with argument
 '+global_header'.
 Reading option '-codec' ... matched as option 'codec' (codec name) with
 argument 'copy'.
 Reading option '-copyts' ... matched as option 'copyts' (copy timestamps)
 with argument '1'.
 Reading option 'seek.mp4' ... matched as output file.
 Finished splitting the commandline.
 Parsing a group of options: global .
 Applying option v (set logging level) with argument debug.
 Applying option y (overwrite output files) with argument 1.
 Applying option copyts (copy timestamps) with argument 1.
 Successfully parsed a group of options.
 Parsing a group of options: input file aac_lc.mp4.
 Applying option ss (set the start time offset) with argument 9.002667.
 Successfully parsed a group of options.
 Opening an input file: aac_lc.mp4.
 [file @ 0x273ada0] Setting default whitelist 'file,crypto'
 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x273a520] Format mov,mp4,m4a,3gp,3g2,mj2
 probed with size=2048 and score=100
 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x273a520] ISO: File Type Major Brand: isom
 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x273a520] Unknown dref type 0x08206c7275 size
 12
 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x273a520] Before avformat_find_stream_info()
 pos: 165951 bytes read:37234 seeks:1
 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x273a520] All info found
 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x273a520] After avformat_find_stream_info()
 pos: 214 bytes read:70002 seeks:2 frames:1
 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'aac_lc.mp4':
   Metadata:
     major_brand     : isom
     minor_version   : 512
     compatible_brands: isomiso2mp41
     encoder         : Lavf56.36.100
   Duration: 00:00:20.10, start: 0.000000, bitrate: 66 kb/s
     Stream #0:0(eng), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D),
 48000 Hz, stereo, fltp, 64 kb/s (default)
     Metadata:
       handler_name    : SoundHandler
 Successfully opened the file.
 Parsing a group of options: output file seek.mp4.
 Applying option to (record or transcode stop time) with argument 18.
 Applying option codec (codec name) with argument copy.
 Successfully parsed a group of options.
 Opening an output file: seek.mp4.
 [file @ 0x274dc80] Setting default whitelist 'file,crypto'
 Successfully opened the file.
 Output #0, mp4, to 'seek.mp4':
   Metadata:
     major_brand     : isom
     minor_version   : 512
     compatible_brands: isomiso2mp41
     encoder         : Lavf57.31.100
     Stream #0:0(eng), 0, 1/48000: Audio: aac (LC) ([64][0][0][0] /
 0x0040), 48000 Hz, stereo, 64 kb/s (default)
     Metadata:
       handler_name    : SoundHandler
 Stream mapping:
   Stream #0:0 -> #0:0 (copy)
 Press [q] to stop, [?] for help
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 No more output streams to write to, finishing.
 size=      73kB time=00:00:18.00 bitrate=  33.1kbits/s speed=7.26e+03x
 video:0kB audio:70kB subtitle:0kB other streams:0kB global headers:0kB
 muxing overhead: 3.393788%
 Input file #0 (aac_lc.mp4):
   Input stream #0:0 (audio): 423 packets read (72123 bytes);
   Total: 423 packets (72123 bytes) demuxed
 Output file #0 (seek.mp4):
   Output stream #0:0 (audio): 422 packets muxed (71955 bytes);
   Total: 422 packets (71955 bytes) muxed
 0 frames successfully decoded, 0 decoding errors
 [AVIOContext @ 0x2755e60] Statistics: 30 seeks, 445 writeouts
 [AVIOContext @ 0x2743040] Statistics: 162974 bytes read, 3 seeks
 }}}
 The incorrect timestamps can be seen by running ffprobe -show_packets on
 the resulting seek.mp4

 Output with the segment approach (without debug since segment logs every
 packet..):
 {{{
 root at bf6643488050:# ffmpeg -y -i aac_lc.mp4 -flags +global_header -codec
 copy -f segment -segment_format mp4 -segment_time 9 seg%02d.mp4
 ffmpeg version N-79258-g3a9611d Copyright (c) 2000-2016 the FFmpeg
 developers
   built with gcc 5.2.1 (Ubuntu 5.2.1-22ubuntu2) 20151010
   configuration: --prefix=/tmp/tmp_build_dir --pkg-config-flags=--static
 --extra-cflags=-I/tmp/tmp_build_dir/include --extra-
 ldflags=-L/tmp/tmp_build_dir/lib --bindir=/root/bin --enable-gpl --enable-
 nonfree --enable-libx264 --enable-libsoxr --enable-libfdk-aac
   libavutil      55. 20.100 / 55. 20.100
   libavcodec     57. 34.100 / 57. 34.100
   libavformat    57. 31.100 / 57. 31.100
   libavdevice    57.  0.101 / 57.  0.101
   libavfilter     6. 41.100 /  6. 41.100
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  0.101 /  2.  0.101
   libpostproc    54.  0.100 / 54.  0.100
 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'aac_lc.mp4':
   Metadata:
     major_brand     : isom
     minor_version   : 512
     compatible_brands: isomiso2mp41
     encoder         : Lavf56.36.100
   Duration: 00:00:20.10, start: 0.000000, bitrate: 66 kb/s
     Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz,
 stereo, fltp, 64 kb/s (default)
     Metadata:
       handler_name    : SoundHandler
 Output #0, segment, to 'seg%02d.mp4':
   Metadata:
     major_brand     : isom
     minor_version   : 512
     compatible_brands: isomiso2mp41
     encoder         : Lavf57.31.100
     Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz,
 stereo, 64 kb/s (default)
     Metadata:
       handler_name    : SoundHandler
 Stream mapping:
   Stream #0:0 -> #0:0 (copy)
 Press [q] to stop, [?] for help
 size=N/A time=00:00:20.05 bitrate=N/A speed=2.57e+03x
 video:0kB audio:158kB subtitle:0kB other streams:0kB global headers:0kB
 muxing overhead: unknown
 }}}
 The incorrect timestamps can be seen by running ffprobe -show_packets on
 the resulting seg01.mp4

 It is interesting to execute the segment command using -v debug. There we
 can see that the segment muxer outputs the correct, non-shifted,
 timestamps for each packet. So it seems there is something in the mov/mp4
 muxer??

 Tested with latest nightly, but the issue is there in 3.0.1 as well.

 Attaching the file I used for testing.

--
Ticket URL: <https://trac.ffmpeg.org/ticket/5415>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list