QML MediaRecorder records very quiet audio on Android and distorted audio with noise on iOS
-
Environment
Qt version: 6.9.2
Platforms tested: Android 15 (Samsung Galaxy S22), iOS 18 (iPhone 13 Pro)
Module: Qt Multimedia (QML, MediaRecorder / CaptureSession)
Steps to reproduce
Minimal QML example:MicrophonePermission {
id: microphonePermission
onStatusChanged: {}
}CaptureSession { id: captureSession audioInput: AudioInput { volume: 1 } recorder: MediaRecorder { id: recorder audioSampleRate: 48000 audioChannelCount: 1 mediaFormat { fileFormat: MediaFormat.Wave audioCodec: MediaFormat.AudioCodec.Wave } quality: MediaRecorder.NormalQuality onDurationChanged: (duration) => {} onRecorderStateChanged: { if (recorderState === MediaRecorder.StoppedState) { app.onSpeechRecorded(actualLocation, duration); } } } } Button { id: recButton text: "Rec" onPressed: { if (microphonePermission.status === Qt.PermissionStatus.Undetermined) { microphonePermission.request(); } else { recorder.record(); } } }
Expected result
Normal audio recording volume on Android and iOS.
Clean audio without noise/distortion.
Actual result
On Android: audio is recorded, but the volume is extremely low even with AudioInput.volume = 1.
On iOS: audio is also very quiet, and additionally contains noticeable background noise/distortion.
Notes
Issue occurs with the minimal example above.
Increasing audioSampleRate, volume, or quality does not improve the situation.
-
adding this code solves the problem for IOS
AVAudioSession *session = [AVAudioSession sharedInstance]; NSError *err = nil; [session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:(AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionAllowBluetoothA2DP) error:&err]; [session setMode:AVAudioSessionModeSpokenAudio error:&err]; [session setPreferredSampleRate:48000 error:&err]; [session setPreferredIOBufferDuration:0.01 error:&err]; [session setActive:YES error:&err];