[FFmpeg-trac] #9228(documentation:closed): multiple output in single C/libavcodec xcode process offsets "start" in output files
FFmpeg
trac at avcodec.org
Tue May 11 15:13:53 EEST 2021
#9228: multiple output in single C/libavcodec xcode process offsets "start" in
output files
-------------------------------------+-------------------------------------
Reporter: Ray | Owner: (none)
Type: defect | Status: closed
Priority: normal | Component:
| documentation
Version: git-master | Resolution: invalid
Keywords: AAC | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Changes (by Ray):
* component: avcodec => documentation
Old description:
> Summary of the bug:
>
> I have a C/libavcodec program that transcodes multiple input files to
> resulting mp3 or m4a using the inbuilt ffmeg libmp3lame or aac encoders
> respectively. No libavcodec constructs are reused (new AVCodecContext,
> AVFormatContext, AVAudioFifo used for every transcode)
>
> When generating .m4a output, examining the output using ffprobe, I
> observe the "start" is incrementally offset. the first m4a file is at
> 00:00:00 but the subsequent m4a file has a "start" that is offset by a
> time very close to the length of the first file. This does not happen
> when transcoding to mp3.
>
> I have been able to reproduce this using the examples/transcode_aac.c and
> modified it so that it creates multiple files.
>
> For example, when transcoding the same 5sec wav file to m4a within the
> same process generates a set of files but the start time is offset
> further and further as each new file is generated - note the "start" time
>
> {{{
> $ for i in /tmp/a/foo*m4a; do ffprobe -hide_banner -i $i; done
> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/a/foo00.m4a':
> Metadata:
> major_brand : M4A
> minor_version : 512
> compatible_brands: isomiso2
> encoder : Lavf58.29.100
> Duration: 00:00:05.02, start: 0.000000, bitrate: 79 kb/s
> Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz,
> stereo, fltp, 76 kb/s (default)
> Metadata:
> handler_name : SoundHandler
> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/a/foo01.m4a':
> Metadata:
> major_brand : M4A
> minor_version : 512
> compatible_brands: isomiso2
> encoder : Lavf58.29.100
> Duration: 00:00:05.02, start: 4.976009, bitrate: 79 kb/s
> Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz,
> stereo, fltp, 76 kb/s (default)
> Metadata:
> handler_name : SoundHandler
> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/a/foo02.m4a':
> Metadata:
> major_brand : M4A
> minor_version : 512
> compatible_brands: isomiso2
> encoder : Lavf58.29.100
> Duration: 00:00:05.02, start: 9.976009, bitrate: 79 kb/s
> Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz,
> stereo, fltp, 76 kb/s (default)
> Metadata:
> handler_name : SoundHandler
> }}}
> I would expect ALL files to be identical. I tested this with built in
> aac and also libfdk_aac and both exhibit this behaviour
>
> How to reproduce:
> {{{
> # have a single process that will transocde mulitple files to aac within
> a single process.
> # see attached patched transcode_aac.c
>
> $ ./transcode_aac input.wav output m4a 3
>
> # generates 3x m4a encoded by inbuilt "aac" encoder called
> output{00,01,02}.m4a
>
> # examine the output files, observing the start time via ffprobe
> }}}
>
> Attached are the wav input, m4a outputs and the sameple src code that
> demonstrates this - code is examples/doc/transcode_aac.c with a loop
> around old main() function with a new output file name on next iteration.
New description:
[solved]: issue related to user solution based on ffmpeg's transcode_aac
example that uses global static pts for frame.
Summary of the bug:
I have a C/libavcodec program that transcodes multiple input files to
resulting mp3 or m4a using the inbuilt ffmeg libmp3lame or aac encoders
respectively. No libavcodec constructs are reused (new AVCodecContext,
AVFormatContext, AVAudioFifo used for every transcode)
When generating .m4a output, examining the output using ffprobe, I observe
the "start" is incrementally offset. the first m4a file is at 00:00:00
but the subsequent m4a file has a "start" that is offset by a time very
close to the length of the first file. This does not happen when
transcoding to mp3.
I have been able to reproduce this using the examples/transcode_aac.c and
modified it so that it creates multiple files.
For example, when transcoding the same 5sec wav file to m4a within the
same process generates a set of files but the start time is offset further
and further as each new file is generated - note the "start" time
{{{
$ for i in /tmp/a/foo*m4a; do ffprobe -hide_banner -i $i; done
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/a/foo00.m4a':
Metadata:
major_brand : M4A
minor_version : 512
compatible_brands: isomiso2
encoder : Lavf58.29.100
Duration: 00:00:05.02, start: 0.000000, bitrate: 79 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz,
stereo, fltp, 76 kb/s (default)
Metadata:
handler_name : SoundHandler
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/a/foo01.m4a':
Metadata:
major_brand : M4A
minor_version : 512
compatible_brands: isomiso2
encoder : Lavf58.29.100
Duration: 00:00:05.02, start: 4.976009, bitrate: 79 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz,
stereo, fltp, 76 kb/s (default)
Metadata:
handler_name : SoundHandler
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/a/foo02.m4a':
Metadata:
major_brand : M4A
minor_version : 512
compatible_brands: isomiso2
encoder : Lavf58.29.100
Duration: 00:00:05.02, start: 9.976009, bitrate: 79 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz,
stereo, fltp, 76 kb/s (default)
Metadata:
handler_name : SoundHandler
}}}
I would expect ALL files to be identical. I tested this with built in aac
and also libfdk_aac and both exhibit this behaviour
How to reproduce:
{{{
# have a single process that will transocde mulitple files to aac within a
single process.
# see attached patched transcode_aac.c
$ ./transcode_aac input.wav output m4a 3
# generates 3x m4a encoded by inbuilt "aac" encoder called
output{00,01,02}.m4a
# examine the output files, observing the start time via ffprobe
}}}
Attached are the wav input, m4a outputs and the sameple src code that
demonstrates this - code is examples/doc/transcode_aac.c with a loop
around old main() function with a new output file name on next iteration.
--
--
Ticket URL: <https://trac.ffmpeg.org/ticket/9228#comment:7>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list