Skip to content

Commit bef59ac

Browse files
felix920506pre-commit-ci[bot]JustaSqu1d
authored
fix: make FFmpegOpusAudio codec behave as docs suggest (#2581)
* make ffmpegopusaudio codec behave according to docs * style(pre-commit): auto fixes from pre-commit.com hooks * Update CHANGELOG.md * Apply suggestions from code review Co-authored-by: JustaSqu1d <[email protected]> Signed-off-by: felix920506 <[email protected]> * style(pre-commit): auto fixes from pre-commit.com hooks --------- Signed-off-by: felix920506 <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: JustaSqu1d <[email protected]>
1 parent e09c607 commit bef59ac

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ These changes are available on the `master` branch, but have not yet been releas
2727

2828
- Fixed `Enum` options not setting the correct type when only one choice is available.
2929
([#2577](https://github.com/Pycord-Development/pycord/pull/2577))
30+
- Fixed `codec` option for `FFmpegOpusAudio` class to make it in line with
31+
documentation. ([#2581](https://github.com/Pycord-Development/pycord/pull/2581))
3032

3133
### Changed
3234

discord/player.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,9 @@ class FFmpegOpusAudio(FFmpegAudio):
355355
The codec to use to encode the audio data. Normally this would be
356356
just ``libopus``, but is used by :meth:`FFmpegOpusAudio.from_probe` to
357357
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``.
360361
361362
.. warning::
362363
@@ -407,7 +408,9 @@ def __init__(
407408
args.append("-i")
408409
args.append("-" if pipe else source)
409410

410-
codec = "copy" if codec in ("opus", "libopus") else "libopus"
411+
# use "libopus" when "opus" is specified since the "opus" encoder is incomplete
412+
# link to ffmpeg docs: https://www.ffmpeg.org/ffmpeg-codecs.html#opus
413+
codec = "copy" if codec == "copy" else "libopus"
411414

412415
args.extend(
413416
(
@@ -417,17 +420,24 @@ def __init__(
417420
"opus",
418421
"-c:a",
419422
codec,
420-
"-ar",
421-
"48000",
422-
"-ac",
423-
"2",
424-
"-b:a",
425-
f"{bitrate}k",
426423
"-loglevel",
427424
"warning",
428425
)
429426
)
430427

428+
# only pass in bitrate, sample rate, channels arguments when actually encoding to avoid ffmpeg warnings
429+
if codec != "copy":
430+
args.extend(
431+
(
432+
"-ar",
433+
"48000",
434+
"-ac",
435+
"2",
436+
"-b:a",
437+
f"{bitrate}k",
438+
)
439+
)
440+
431441
if isinstance(options, str):
432442
args.extend(shlex.split(options))
433443

@@ -501,6 +511,8 @@ def custom_probe(source, executable):
501511

502512
executable = kwargs.get("executable")
503513
codec, bitrate = await cls.probe(source, method=method, executable=executable)
514+
# only re-encode if the source isn't already opus, else directly copy the source audio stream
515+
codec = "copy" if codec in ("opus", "libopus") else "libopus"
504516
return cls(source, bitrate=bitrate, codec=codec, **kwargs) # type: ignore
505517

506518
@classmethod

0 commit comments

Comments
 (0)