1

Is there a way of forcing ffmpeg to encode each audio stream in a different thread?

ffmpeg
    -i audio1.ac3 -c:a libopus
    -i audio2.ac3 -c:a libopus
    -i audio3.ac3 -c:a libopus
    output.mkv

I mean only ffmpeg's own instruments, without multiple processes and other OS features.

Normally, there is only one core saturated, so encoding a file with many audio streams is very long.

Exact command:

ffmpeg -loglevel verbose
    -i 'Ярость (Fury).mkv'
    -i 'Fury (2014) [Ukr & Eng, Sub Eng] BDRip-AVC [Hurtom & HELLYWOOD].mkv'
    -threads 0 -max_muxing_queue_size 65536 -avoid_negative_ts 1 -metadata title=2014.Fury.BDRip.HEVC.1080p
    -map 0:0 -c:v copy -metadata:s:v:0 title=2014.Fury.BDRip.HEVC.1080p -disposition:v:0 +default-forced
    -map 0:2 -c:a libopus -application audio -vbr on -packet_loss 0 -frame_duration 20 -mapping_family 255 -compression_level 10 -metadata:s:a:0 language=eng -metadata:s:a:0 title=Original -disposition:a:0 +default-forced
    -map 1:1 -c:a libopus -application audio -vbr on -packet_loss 0 -frame_duration 20 -mapping_family 255 -compression_level 10 -metadata:s:a:1 language=ukr -disposition:a:1 -default-forced
    -map 0:1 -c:a libopus -application audio -vbr on -packet_loss 0 -frame_duration 20 -mapping_family 255 -compression_level 10 -metadata:s:a:2 language=rus -metadata:s:a:2 title=Dub -disposition:a:2 -default-forced
    -map 0:10 -c:s copy -metadata:s:s:0 language=eng -metadata:s:s:0 title=Original -disposition:s:0 -default-forced
    -f matroska ./2014.Fury.BDRip.HEVC.1080p.mkv

Log:

... inputs ...
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:2 -> #0:1 (dts (dca) -> opus (libopus))
  Stream #1:1 -> #0:2 (ac3 (native) -> opus (libopus))
  Stream #0:1 -> #0:3 (ac3 (native) -> opus (libopus))
  Stream #0:10 -> #0:4 (copy)
Press [q] to stop, [?] for help
[graph_2_in_0_1 @ 0000019ca2cb29c0] tb:1/48000 samplefmt:fltp samplerate:48000 chlayout:0x60f
[format_out_0_3 @ 0000019ca2cb20c0] auto-inserting filter 'auto_resampler_0' between the filter 'Parsed_anull_0' and the filter 'format_out_0_3'
[auto_resampler_0 @ 0000019ca2cb27c0] ch:6 chl:5.1(side) fmt:fltp r:48000Hz -> ch:6 chl:5.1(side) fmt:flt r:48000Hz
[libopus @ 0000019ca2c9f3c0] No bit rate set. Defaulting to 384000 bps.
[graph_0_in_0_2 @ 0000019ca2cb1ac0] tb:1/48000 samplefmt:fltp samplerate:48000 chlayout:0x60f
[format_out_0_1 @ 0000019ca2cb1bc0] auto-inserting filter 'auto_resampler_0' between the filter 'Parsed_anull_0' and the filter 'format_out_0_1'
[auto_resampler_0 @ 0000019ca2cb14c0] ch:6 chl:5.1(side) fmt:fltp r:48000Hz -> ch:6 chl:5.1(side) fmt:flt r:48000Hz
[libopus @ 0000019ca292c980] No bit rate set. Defaulting to 384000 bps.
[graph_1_in_1_1 @ 0000019ca2cb2bc0] tb:1/48000 samplefmt:fltp samplerate:48000 chlayout:0x60f
[format_out_0_2 @ 0000019ca2cb26c0] auto-inserting filter 'auto_resampler_0' between the filter 'Parsed_anull_0' and the filter 'format_out_0_2'
[auto_resampler_0 @ 0000019ca2cb0dc0] ch:6 chl:5.1(side) fmt:fltp r:48000Hz -> ch:6 chl:5.1(side) fmt:flt r:48000Hz
[libopus @ 0000019ca292e980] No bit rate set. Defaulting to 384000 bps.
Output #0, matroska, to './2014.Fury.BDRip.HEVC.1080p.mkv':
  Metadata:
    DATE_RELEASED   : 2014
    title           : 2014.Fury.BDRip.HEVC.1080p
    Released by     : Buba5473 for NNM-Club
    Copyright       : Encoded by Goor80
    encoder         : Lavf58.12.100
    Chapter #0:0: start 0.000000, end 478.228000
    Metadata:
      title           : Chapter 01
    ... chapters ...
    Stream #0:0: Video: hevc (Main 10), 1 reference frame, yuv420p10le(tv), 1920x800 (0x0) [SAR 1:1 DAR 12:5], q=2-31, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc (default)
    Stream #0:1(eng): Audio: opus (libopus) ([255][255][255][255] / 0xFFFFFFFF), 48000 Hz, 5.1(side), flt, delay 312, 384 kb/s (default)
    Stream #0:2(ukr): Audio: opus (libopus) ([255][255][255][255] / 0xFFFFFFFF), 48000 Hz, 5.1(side), flt, delay 312, 384 kb/s
    Stream #0:3(rus): Audio: opus (libopus) ([255][255][255][255] / 0xFFFFFFFF), 48000 Hz, 5.1(side), flt, delay 312, 384 kb/s
    Stream #0:4(eng): Subtitle: subrip
[matroska @ 0000019ca2d17f00] Starting new cluster due to timestamp=6175.5kbits/s speed=10.2x
[matroska @ 0000019ca2d17f00] Starting new cluster due to timestamp=7530.8kbits/s speed=8.74x
[matroska @ 0000019ca2d17f00] Starting new cluster due to timestamp=7955.1kbits/s speed=9.02x
frame=156607 fps=205 q=-1.0 size= 8321971kB time=01:48:51.85 bitrate=10437.1kbits/s speed=8.55x
... not finished yet ...

fps is always around 3000/number_of_audio_channels, meaning all audio transcoding is done with the only thread.

8
  • Is that your exact command?
    – Gyan
    May 30, 2018 at 15:54
  • No, I removed unrelated options and details for better readability. I have tried to play with -threads, but this option is only about per-stream multithreading.
    – hedgar2017
    May 30, 2018 at 17:28
  • Share your exact command and log.
    – Gyan
    May 30, 2018 at 17:37
  • Posted the exact command and log above.
    – hedgar2017
    May 30, 2018 at 17:45
  • fps=205 only represents turnover of video frames.
    – Gyan
    Aug 17, 2018 at 13:41

1 Answer 1

1
+50

Most (all ?) audio encoders are single-threaded and afaict, all encoding will occur in the main thread.

Maybe worth filing a feature request at trac.ffmpeg.org

1
  • I have already developed a wrapper running an ffmpeg instance for each stream and then mkvmerge'ing them together. Thanks for your help anyway.
    – hedgar2017
    Aug 26, 2018 at 18:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.