Skip to content

Commit 211be5e

Browse files
committed
obs-ffmpeg: Fix Opus encoder bitrate and errors
The Opus encoder was using the AAC encoder's properties function which allows bitrates up to 1024 kbps. However, FFmpeg's libopus enforces a maximum of 256 kbps per channel. Users selecting bitrates above 256 kbps would encounter confusing "Failed to open AAC codec" errors. This commit adds a dedicated opus_properties() function that sets the correct bitrate range (64-256 kbps). The 256 kbps limit is more than sufficient for Opus, as typical WebRTC usage is only 30-90 kbps. Additionally, fixes hardcoded "AAC codec" error messages in initialize_codec() to display the actual codec name, improving error reporting for all FFmpeg audio encoders. Fixes #12753
1 parent c025f21 commit 211be5e

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,10 @@ static bool initialize_codec(struct enc_encoder *enc)
128128
ret = avcodec_open2(enc->context, enc->codec, NULL);
129129
if (ret < 0) {
130130
struct dstr error_message = {0};
131-
dstr_printf(&error_message, "Failed to open AAC codec: %s", av_err2str(ret));
131+
dstr_printf(&error_message, "Failed to open %s codec: %s", enc->type, av_err2str(ret));
132132
obs_encoder_set_last_error(enc->encoder, error_message.array);
133133
dstr_free(&error_message);
134-
warn("Failed to open AAC codec: %s", av_err2str(ret));
134+
warn("Failed to open %s codec: %s", enc->type, av_err2str(ret));
135135
return false;
136136
}
137137
enc->aframe->format = enc->context->sample_fmt;
@@ -422,6 +422,18 @@ static obs_properties_t *enc_properties(void *unused)
422422
return props;
423423
}
424424

425+
static obs_properties_t *opus_properties(void *unused)
426+
{
427+
UNUSED_PARAMETER(unused);
428+
429+
obs_properties_t *props = obs_properties_create();
430+
/* FFmpeg libopus encoder maximum bitrate is 256 kbps per channel.
431+
* For typical stereo/mono usage, 256 kbps provides excellent quality
432+
* (Opus is highly efficient - typical WebRTC usage is 30-90 kbps). */
433+
obs_properties_add_int(props, "bitrate", obs_module_text("Bitrate"), 64, 256, 32);
434+
return props;
435+
}
436+
425437
static bool enc_extra_data(void *data, uint8_t **extra_data, size_t *size)
426438
{
427439
struct enc_encoder *enc = data;
@@ -481,7 +493,7 @@ struct obs_encoder_info opus_encoder_info = {
481493
.encode = enc_encode,
482494
.get_frame_size = enc_frame_size,
483495
.get_defaults = enc_defaults,
484-
.get_properties = enc_properties,
496+
.get_properties = opus_properties,
485497
.get_extra_data = enc_extra_data,
486498
.get_audio_info = enc_audio_info,
487499
};

0 commit comments

Comments
 (0)