Opened 3 years ago

Last modified 6 months ago

#3622 reopened defect

Second audio track in mov sometimes marked as default

Reported by: cehoyos Owned by:
Priority: important Component: avformat
Version: git-master Keywords: mov regression
Cc: julian@corecode.at, james.heliker@gmail.com Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

Related to ticket #468, #1174 and #2626

The following command line produces an output file with exactly one enabled audio track (the first one), the second audio track is not enabled:

$ ffmpeg -i fate-suite/mp3-conformance/compl.bit -i fate-suite/mp3-conformance/he_32khz.bit -acodec aac -strict -2 -map 0:0 -map 1:0 out.mov

But the following command produces an output file with two enabled audio tracks, this is bad for playback with QuickTime?:

$ ffmpeg -i fate-suite/aac/al04_44.mp4 -i fate-suite/aac/al05_44.mp4 -acodec aac -strict -2 -map 0:0 -map 1:0 out2.mov
ffmpeg version N-63026-g54ae588 Copyright (c) 2000-2014 the FFmpeg developers
  built on May  7 2014 22:40:04 with gcc 4.7 (SUSE Linux)
  configuration: --enable-gpl
  libavutil      52. 81.100 / 52. 81.100
  libavcodec     55. 60.103 / 55. 60.103
  libavformat    55. 37.102 / 55. 37.102
  libavdevice    55. 13.101 / 55. 13.101
  libavfilter     4.  5.100 /  4.  5.100
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 18.100 /  0. 18.100
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'fate-suite/aac/al04_44.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isom
    creation_time   : 2004-02-19 14:38:56
  Duration: 00:00:08.24, start: 0.000000, bitrate: 67 kb/s
    Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
    Metadata:
      creation_time   : 2004-02-19 14:38:56
      handler_name    : soun
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'fate-suite/aac/al05_44.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isom
    creation_time   : 2004-02-19 14:38:56
  Duration: 00:00:07.43, start: 0.000000, bitrate: 131 kb/s
    Stream #1:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      creation_time   : 2004-02-19 14:38:56
      handler_name    : soun
Output #0, mov, to 'out2.mov':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isom
    encoder         : Lavf55.37.102
    Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2004-02-19 14:38:56
      handler_name    : soun
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2004-02-19 14:38:56
      handler_name    : soun
Stream mapping:
  Stream #0:0 -> #0:0 (aac -> aac)
  Stream #1:0 -> #0:1 (aac -> aac)
Press [q] to stop, [?] for help
size=     252kB time=00:00:08.24 bitrate= 250.6kbits/s
video:0kB audio:246kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.660035%

out2.mov has both audio tracks enabled, this is a regression since 800ea20c

Attachments (2)

ffmpeg-2.2.2-defaultstreams.patch (2.6 KB) - added by mcashwell 3 years ago.
Proposed patch
AlternateTrack.png (8.3 KB) - added by jheliker 19 months ago.

Download all attachments as: .zip

Change History (30)

comment:1 Changed 3 years ago by julian

  • Cc julian@corecode.at added

comment:2 Changed 3 years ago by julian

changing
if (st->disposition & AV_DISPOSITION_DEFAULT)

to

if (0 && st->disposition & AV_DISPOSITION_DEFAULT)

fixes everything for my purpose. only first audio track is enabled, like in ffmpeg 1.2.x

comment:3 Changed 3 years ago by mcashwell

I've been fighting the same problem. An m4v container written by ffmpeg-2.2.2 with one h.264 video stream and two audio streams (one AAC and one AC3) is shown by ffprobe as having 3 "default" streams and the audio does not play on an Apple TV 3.

The same source file converted with Handbrake plays correctly on the ATV3 and ffprobe shows only the first audio stream as "default".

This is a real problem for my workflow. Other than digging into source I'm not at all familiar with (and dealing with compiling it entirely manually rather than with Homebrew) I'm happy to assist in any way to get this fixed.

comment:4 Changed 3 years ago by julian

i can only tell you that the change from comment2 makes this work for me and building ffmpeg from source is quite a joy compared to nearly all other common large packages

Changed 3 years ago by mcashwell

Proposed patch

comment:5 Changed 3 years ago by mcashwell

OK, I bit the bullet (partially) and produced a more complete patch for this. It more correctly identifies which tracks should and shouldn't be enabled.

I'm still using homebrew since it so easily deals with all the external dependencies but this means I'm not manually doing make and thus am not in a position to be able to run "make fate" to do the regression tests needed to post patches to ffmpeg-devel. Sorry but I just don't have time currently to start from scratch building things. Julian, if you want to do that then feel free to use my patch. :-)

That's lame I know but work's crushing me now and I just don't have any more spare cycles.

Last edited 3 years ago by mcashwell (previous) (diff)

comment:6 Changed 3 years ago by julian

i ran "make fate" on 2.2.2 without and with you patch and couldn't notice any differences. how would a test failure make itself known? where are the results?

comment:7 Changed 3 years ago by outlyer

In case it's helpful to anyone; I uploaded a Homebrew build script and patch as GitHub? Gists and you can find them here. If you replace your existing ffmpeg.rb with the Gist, it should download and build a patched version of ffmpeg 2.2.3.

https://gist.github.com/outlyer/4a88f1adb7f895b93fd9

For what it's worth, I've also found this patch worked to solve the disabled track issue on both 2.2.2 and 2.2.3 and make fate didn't report any issues of note.

comment:8 Changed 3 years ago by michael

  • Resolution set to fixed
  • Status changed from new to closed

Should have been fixed by merging code from Luca Barbato in 4c91599484e115e9b51c884fc46cea3f8511f8ae
This would leave both enabled but should avoid the problem with QT
If this is insufficient and still causes problems then please reopen

comment:9 Changed 3 years ago by julian

thanks for the fix. will test as soon as i move to git-head and let you know in case the solution is insufficient.

comment:10 follow-up: Changed 3 years ago by cehoyos

  • Resolution fixed deleted
  • Status changed from closed to reopened

The issue is still reproducible with current FFmpeg git head:

$ ffmpeg -i fate-suite/aac/al04_44.mp4 -i fate-suite/aac/al05_44.mp4 -acodec aac -strict -2 -map 0:0 -map 1:0 out2.mov
ffmpeg version N-64656-g2a9b4c0 Copyright (c) 2000-2014 the FFmpeg developers
  built on Jul 14 2014 13:56:52 with gcc 4.7 (SUSE Linux)
  configuration: --enable-gpl
  libavutil      52. 92.100 / 52. 92.100
  libavcodec     55. 69.100 / 55. 69.100
  libavformat    55. 46.100 / 55. 46.100
  libavdevice    55. 13.102 / 55. 13.102
  libavfilter     4. 10.100 /  4. 10.100
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 19.100 /  0. 19.100
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'fate-suite/aac/al04_44.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isom
    creation_time   : 2004-02-19 14:38:56
  Duration: 00:00:08.24, start: 0.000000, bitrate: 67 kb/s
    Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
    Metadata:
      creation_time   : 2004-02-19 14:38:56
      handler_name    : soun
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'fate-suite/aac/al05_44.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isom
    creation_time   : 2004-02-19 14:38:56
  Duration: 00:00:07.43, start: 0.000000, bitrate: 131 kb/s
    Stream #1:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      creation_time   : 2004-02-19 14:38:56
      handler_name    : soun
[mov @ 0x2188d00] Using AVStream.codec.time_base as a timebase hint to the muxer is deprecated. Set AVStream.time_base instead.
    Last message repeated 1 times
Output #0, mov, to 'out2.mov':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isom
    encoder         : Lavf55.46.100
    Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2004-02-19 14:38:56
      handler_name    : soun
      encoder         : Lavc55.69.100 aac
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2004-02-19 14:38:56
      handler_name    : soun
      encoder         : Lavc55.69.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (aac (native) -> aac (native))
  Stream #1:0 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
size=     252kB time=00:00:08.24 bitrate= 250.6kbits/s
video:0kB audio:246kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.660035%
$ ffmpeg -i out2.mov
ffmpeg version N-64656-g2a9b4c0 Copyright (c) 2000-2014 the FFmpeg developers
  built on Jul 14 2014 13:56:52 with gcc 4.7 (SUSE Linux)
  configuration: --enable-gpl
  libavutil      52. 92.100 / 52. 92.100
  libavcodec     55. 69.100 / 55. 69.100
  libavformat    55. 46.100 / 55. 46.100
  libavdevice    55. 13.102 / 55. 13.102
  libavfilter     4. 10.100 /  4. 10.100
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 19.100 /  0. 19.100
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out2.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 512
    compatible_brands: qt
    encoder         : Lavf55.46.100
  Duration: 00:00:08.27, start: 0.023220, bitrate: 249 kb/s
    Stream #0:0(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 126 kb/s (default)
    Metadata:
      handler_name    : DataHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default)
    Metadata:
      handler_name    : DataHandler
At least one output file must be specified

comment:11 in reply to: ↑ 10 ; follow-up: Changed 3 years ago by michael

Replying to cehoyos:

The issue is still reproducible with current FFmpeg git head:

can you explain in which way it is insufficient ? / what did QT do ?

comment:12 in reply to: ↑ 11 Changed 3 years ago by outlyer

Replying to michael:

Replying to cehoyos:

The issue is still reproducible with current FFmpeg git head:

can you explain in which way it is insufficient ? / what did QT do ?

When a file is played by QuickTime? on a desktop, both audio tracks play simultaneously; on an AppleTV, the AC-3 track is ignored and cannot be played - only the AAC track is usable.

Both audio tracks are visible when ffprobe is used, but having multiple default audio streams causes the problem.

Broken (Unplayable AC-3)

   Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 256 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:2(eng): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 384 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:3(eng): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
    Metadata:
      handler_name    : SubtitleHandler
    Stream #0:4: Video: mjpeg, yuvj444p(pc), 600x600 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn, 90k tbc

Playable (Working dual-audio)

    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 256 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:2(eng): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 384 kb/s
    Metadata:
      handler_name    : SoundHandler
    Stream #0:3(eng): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
    Metadata:
      handler_name    : SubtitleHandler
    Stream #0:4: Video: mjpeg, yuvj444p(pc), 600x600 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn, 90k tbc

comment:13 Changed 3 years ago by outlyer

I've updated the patch to apply against the 2.3.x series. It, along with the Homebrew formula can be found here:

https://gist.github.com/outlyer/4a88f1adb7f895b93fd9

I ran make fate and it was clean.

comment:14 Changed 3 years ago by julian

this is still a issue in git-master
download files:
https://dl.dropboxusercontent.com/u/7221986/ffmpeg_ticket3622.mkv
https://dl.dropboxusercontent.com/u/7221986/ffmpeg_ticket3622.aac

output file test.mp4 has both audio tracks enabled ;(

ffmpeg -i ffmpeg_ticket3622.mkv -i ffmpeg_ticket3622.aac -map 0:0 -map 1:0 -map 0:1 -vcodec copy -acodec copy test.mp4
ffmpeg version N-67684-g12630fa Copyright (c) 2000-2014 the FFmpeg developers
  built on Nov 15 2014 13:27:31 with Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn)
  configuration: 
  libavutil      54. 11.100 / 54. 11.100
  libavcodec     56. 12.101 / 56. 12.101
  libavformat    56. 12.103 / 56. 12.103
  libavdevice    56.  3.100 / 56.  3.100
  libavfilter     5.  2.103 /  5.  2.103
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
Input #0, matroska,webm, from 'ffmpeg_ticket3622.mkv':
  Metadata:
    title           : The Dark Knight Rises (2012)
    ENCODER         : Lavf55.19.104
  Duration: 00:00:12.89, start: 0.083000, bitrate: 9844 kb/s
    Chapter #0:0: start 0.000000, end 10.000000
    Metadata:
      title           : 00:00:00.000
    Stream #0:0: Video: h264 (High), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Metadata:
      title           : 1080p
    Stream #0:1(ger): Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s (default)
    Metadata:
      title           : AC3
      LANGUAGE        : ger
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'ffmpeg_ticket3622.aac':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isom
    creation_time   : 2022-08-10 10:47:44
  Duration: 00:00:12.70, start: 0.044000, bitrate: 162 kb/s
    Stream #1:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 159 kb/s (default)
    Metadata:
      creation_time   : 2022-08-10 10:47:44
[mp4 @ 0x7f907b034800] track 2: codec frame size is not set
Output #0, mp4, to 'test.mp4':
  Metadata:
    title           : The Dark Knight Rises (2012)
    encoder         : Lavf56.12.103
    Chapter #0:0: start 0.000000, end 9.917000
    Metadata:
      title           : 00:00:00.000
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 23.98 fps, 16k tbn, 1k tbc (default)
    Metadata:
      title           : 1080p
    Stream #0:1(eng): Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, stereo, 159 kb/s (default)
    Metadata:
      creation_time   : 2022-08-10 10:47:44
    Stream #0:2(ger): Audio: ac3 ([165][0][0][0] / 0x00A5), 48000 Hz, 5.1(side), 448 kb/s (default)
    Metadata:
      title           : AC3
      LANGUAGE        : ger
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (copy)
  Stream #0:1 -> #0:2 (copy)
Press [q] to stop, [?] for help
frame=  307 fps=0.0 q=-1.0 Lsize=   15745kB time=00:00:12.75 bitrate=10110.6kbits/s    
video:14785kB audio:943kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.104643%

comment:15 Changed 2 years ago by Atarikid

This is still happening with FFmpeg 2.6.1 - this needs a fix asap.

comment:16 Changed 2 years ago by julian

just apply the patch

i'm not sure why the patch doesn't go mainline

comment:17 Changed 2 years ago by tessus

May I ask the status of this ticket?

Will this patch be applied to git master?

comment:18 Changed 22 months ago by julian

i had to move the uploaded file to reproduce the issue:

http://www.filehosting.org/file/details/501459/ffmpeg_3622_default.zip

comment:19 follow-up: Changed 21 months ago by kennyboy97

The fix proposed and executed in this ticket works for a specific workflow. However there are other workflows that require all audio tracks to be enabled upon the MOV being created such as delivery to iTunes, or Netflix, or professional post production facilities internal workflows. I would like to propose (if it's possible) to have some type of switch in the code allowing someone to tell FFMPEG to either make only track 1 enabled or to make all tracks enabled.

Changed 19 months ago by jheliker

comment:20 in reply to: ↑ 19 Changed 19 months ago by jheliker

Replying to kennyboy97:

The fix proposed and executed in this ticket works for a specific workflow. However there are other workflows that require all audio tracks to be enabled upon the MOV being created such as delivery to iTunes, or Netflix, or professional post production facilities internal workflows. I would like to propose (if it's possible) to have some type of switch in the code allowing someone to tell FFMPEG to either make only track 1 enabled or to make all tracks enabled.

I work with many people facing this same issue. It's surprising to me that the FFmpeg developers would introduce a behavior like this without any mechanism of control, to satisfy one user's request: https://trac.ffmpeg.org/ticket/2626

That said, per the attached screen shot (https://trac.ffmpeg.org/attachment/ticket/3622/AlternateTrack.png), the issue here is that the audio tracks are being created as alternates to each other, so there is no way to enable all created audio tracks, and save, unless you remove the Alternate assignment in QuickTime? Player 7 (Pro). This behavior makes a major assumption that your audio content is alternative ie. languages that need to be switched, instead of perhaps stereo, 5.1, and M&E across 3 audio tracks of the QuickTime? file. Is there any plan to fix this?

Last edited 19 months ago by jheliker (previous) (diff)

comment:21 follow-up: Changed 19 months ago by jheliker

  • Cc james.heliker@gmail.com added

comment:22 in reply to: ↑ 21 Changed 19 months ago by bbartelt

Replying to jheliker:

This issue is magnified by the fact that the disabled tracks on the resulting files cannot be modified. If you attempt to re-enable them in quicktime and re-save the file (without doing a "save-as" and creating a new file), the change doesn't stick. When you close and re-open the files the track will remain disabled.

This really needs to be addressed -- it's rendering FFMPEG useless for us. I'd love to please see a response or even better, a patch!

comment:23 follow-up: Changed 19 months ago by julian

I'd love to please see a response or even better, a patch!

there is a patch, see comment 13

comment:24 in reply to: ↑ 23 Changed 19 months ago by outlyer

Replying to julian:

I'd love to please see a response or even better, a patch!

there is a patch, see comment 13

I've updated the patch to apply cleanly against the 2.8.x series. It's here:
https://gist.github.com/outlyer/4a88f1adb7f895b93fd9

comment:25 in reply to: ↑ description Changed 10 months ago by rainabba

I'm currently trying to figure out how to manage the "default" audio track and this ticket is the closest I've come. I'm muxing h264 video along with aac and dts audio and don't have alternative languages so default has nothing to do with languages. Am I suffering this bug or just missing documentation on how to tag a default audio track?

comment:26 Changed 6 months ago by julian

while the patch can be updated to apply against 3.2+ (codec=>codecpar), it now produces broken files. does anyone have an updated patch or some progress on fixing the actual underlying bug?

Last edited 6 months ago by julian (previous) (diff)

comment:27 Changed 6 months ago by julian

ok not true first attempt was incomplete...this works for 3.2

https://gist.github.com/core-code/027bab78a24e0b937a2a6561ea8a8ab9

Note: See TracTickets for help on using tickets.