@@ -355,8 +355,10 @@ class FFmpegOpusAudio(FFmpegAudio):
355
355
The codec to use to encode the audio data. Normally this would be
356
356
just ``libopus``, but is used by :meth:`FFmpegOpusAudio.from_probe` to
357
357
opportunistically skip pointlessly re-encoding Opus audio data by passing
358
- ``copy`` as the codec value. Any values other than ``copy``, ``opus``, or
359
- ``libopus`` will be considered ``libopus``. Defaults to ``libopus``.
358
+ ``copy`` as the codec value. Any values other than ``copy``, or
359
+ ``libopus`` will be considered ``libopus``. ``opus`` will also be considered
360
+ ``libopus`` since the ``opus`` encoder is still in development. Defaults to ``libopus``.
361
+
360
362
361
363
.. warning::
362
364
@@ -407,7 +409,9 @@ def __init__(
407
409
args .append ("-i" )
408
410
args .append ("-" if pipe else source )
409
411
410
- codec = "copy" if codec in ("opus" , "libopus" ) else "libopus"
412
+ # use "libopus" when "opus" is specified since the "opus" encoder is incomplete
413
+ # link to ffmpeg docs: https://www.ffmpeg.org/ffmpeg-codecs.html#opus
414
+ codec = "copy" if codec == "copy" else "libopus"
411
415
412
416
args .extend (
413
417
(
@@ -417,17 +421,24 @@ def __init__(
417
421
"opus" ,
418
422
"-c:a" ,
419
423
codec ,
420
- "-ar" ,
421
- "48000" ,
422
- "-ac" ,
423
- "2" ,
424
- "-b:a" ,
425
- f"{ bitrate } k" ,
426
424
"-loglevel" ,
427
425
"warning" ,
428
426
)
429
427
)
430
428
429
+ # only pass in bitrate, sample rate, channels arguments when actually encoding to avoid ffmpeg warnings
430
+ if codec != "copy" :
431
+ args .extend (
432
+ (
433
+ "-ar" ,
434
+ "48000" ,
435
+ "-ac" ,
436
+ "2" ,
437
+ "-b:a" ,
438
+ f"{ bitrate } k" ,
439
+ )
440
+ )
441
+
431
442
if isinstance (options , str ):
432
443
args .extend (shlex .split (options ))
433
444
@@ -501,6 +512,8 @@ def custom_probe(source, executable):
501
512
502
513
executable = kwargs .get ("executable" )
503
514
codec , bitrate = await cls .probe (source , method = method , executable = executable )
515
+ # only re-encode ir source isn't already opus, else directly copy source audio stream
516
+ codec = "copy" if codec in ("opus" , "libopus" ) else "libopus"
504
517
return cls (source , bitrate = bitrate , codec = codec , ** kwargs ) # type: ignore
505
518
506
519
@classmethod
0 commit comments