diff options
author | Doris Verria <doris.verria@qt.io> | 2023-02-14 16:37:41 +0100 |
---|---|---|
committer | Doris Verria <doris.verria@qt.io> | 2023-02-28 18:10:24 +0100 |
commit | a84280c74193b0f8a54e60e6fc3448bda8250754 (patch) | |
tree | d60161c79b682115f4ffedbbee6e711b08eb8b03 | |
parent | ede9835bbbf752366aaab4f14b20e1fb38017814 (diff) |
AVFMediaEncoder: Set channel count from audio device when recording
When recording audio, we are setting the audio channel count to the
one specified in the encoder settings.
If this is not set, we were setting it to 2 channels by default.
However, this was causing sometimes problems as the internal
AudioConverter could not always convert from the audio capture device's
actual format to one with 2 channels. To avoid this, we should default
to setting the channel count based on that of the audio device.
Note that in a40b9fed50ef75504cec128d4acfb1062e90df98 we set the channel
layout configuration instead of the count, but that information is not
available in 6.2.
Fixes: QTBUG-110844
Change-Id: I3d78ec8b37d6780c7d96147f81ce15bd6425b448
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
(cherry picked from commit a40b9fed50ef75504cec128d4acfb1062e90df98)
-rw-r--r-- | src/multimedia/platform/darwin/camera/avfmediaencoder.mm | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/multimedia/platform/darwin/camera/avfmediaencoder.mm b/src/multimedia/platform/darwin/camera/avfmediaencoder.mm index 8b5f49508..adab52582 100644 --- a/src/multimedia/platform/darwin/camera/avfmediaencoder.mm +++ b/src/multimedia/platform/darwin/camera/avfmediaencoder.mm @@ -52,6 +52,7 @@ #include "private/qmediarecorder_p.h" #include "private/qdarwinformatsinfo_p.h" #include "private/qplatformaudiooutput_p.h" +#include <private/qplatformaudioinput_p.h> #include <QtCore/qmath.h> #include <QtCore/qdebug.h> @@ -135,7 +136,7 @@ void AVFMediaEncoder::updateDuration(qint64 duration) durationChanged(m_duration); } -static NSDictionary *avfAudioSettings(const QMediaEncoderSettings &encoderSettings) +static NSDictionary *avfAudioSettings(const QMediaEncoderSettings &encoderSettings, const QAudioFormat &format) { NSMutableDictionary *settings = [NSMutableDictionary dictionary]; @@ -204,6 +205,10 @@ static NSDictionary *avfAudioSettings(const QMediaEncoderSettings &encoderSettin // Channels int channelCount = encoderSettings.audioChannelCount(); + // if no channel count is set in the encoder settings, + // set it to the device's format channel count + if (channelCount <= 0) + channelCount = format.channelCount(); bool isChannelCountSupported = false; if (channelCount > 0) { std::optional<QList<UInt32>> channelCounts = qt_supported_channel_counts_for_format(codecId); @@ -221,7 +226,7 @@ static NSDictionary *avfAudioSettings(const QMediaEncoderSettings &encoderSettin } } -if (isChannelCountSupported && channelCount > 2) { + if (isChannelCountSupported && channelCount > 2) { AudioChannelLayout channelLayout; memset(&channelLayout, 0, sizeof(AudioChannelLayout)); auto channelLayoutTags = qt_supported_channel_layout_tags_for_format(codecId, channelCount); @@ -233,7 +238,7 @@ if (isChannelCountSupported && channelCount > 2) { } } if (!isChannelCountSupported) - channelCount = 2; + channelCount = 1; [settings setObject:[NSNumber numberWithInt:channelCount] forKey:AVNumberOfChannelsKey]; if (codecId == kAudioFormatAppleLossless) @@ -421,7 +426,9 @@ void AVFMediaEncoder::applySettings(QMediaEncoderSettings &settings) AVFCameraSession *session = m_service->session(); // audio settings - m_audioSettings = avfAudioSettings(settings); + const auto audioInput = m_service->audioInput(); + const QAudioFormat audioFormat = audioInput ? audioInput->device.preferredFormat() : QAudioFormat(); + m_audioSettings = avfAudioSettings(settings, audioFormat); if (m_audioSettings) [m_audioSettings retain]; |