AVFoundation: implement QAudioEncoderSettings.

Change-Id: I24d3da1417142bc80bc6b6c1c8124c246afe03db
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com>
Reviewed-by: Christian Stromme <christian.stromme@qt.io>
This commit is contained in:
Yoann Lopes
2016-02-11 04:34:57 +01:00
committed by Yoann Lopes
parent 2303d2fef8
commit f5de141070
10 changed files with 346 additions and 23 deletions

View File

@@ -0,0 +1,69 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** As a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef AVFAUDIOENCODERSETTINGSCONTROL_H
#define AVFAUDIOENCODERSETTINGSCONTROL_H
#include <qaudioencodersettingscontrol.h>
@class NSDictionary;
@class AVCaptureAudioDataOutput;
QT_BEGIN_NAMESPACE
class AVFCameraService;
class AVFAudioEncoderSettingsControl : public QAudioEncoderSettingsControl
{
public:
explicit AVFAudioEncoderSettingsControl(AVFCameraService *service);
QStringList supportedAudioCodecs() const Q_DECL_OVERRIDE;
QString codecDescription(const QString &codecName) const Q_DECL_OVERRIDE;
QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE;
QAudioEncoderSettings audioSettings() const Q_DECL_OVERRIDE;
void setAudioSettings(const QAudioEncoderSettings &settings) Q_DECL_OVERRIDE;
NSDictionary *applySettings();
void unapplySettings();
private:
AVFCameraService *m_service;
QAudioEncoderSettings m_requestedSettings;
QAudioEncoderSettings m_actualSettings;
};
QT_END_NAMESPACE
#endif // AVFAUDIOENCODERSETTINGSCONTROL_H

View File

@@ -0,0 +1,220 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** As a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "avfaudioencodersettingscontrol.h"
#include "avfcameraservice.h"
#include "avfcamerasession.h"
#include <AVFoundation/AVFoundation.h>
#include <CoreAudio/CoreAudioTypes.h>
QT_BEGIN_NAMESPACE
struct AudioCodecInfo
{
QString description;
int id;
AudioCodecInfo() : id(0) { }
AudioCodecInfo(const QString &desc, int i)
: description(desc), id(i)
{ }
};
typedef QMap<QString, AudioCodecInfo> SupportedAudioCodecs;
Q_GLOBAL_STATIC_WITH_ARGS(QString , defaultCodec, (QLatin1String("aac")))
Q_GLOBAL_STATIC(SupportedAudioCodecs, supportedCodecs)
AVFAudioEncoderSettingsControl::AVFAudioEncoderSettingsControl(AVFCameraService *service)
: QAudioEncoderSettingsControl()
, m_service(service)
{
if (supportedCodecs->isEmpty()) {
supportedCodecs->insert(QStringLiteral("lpcm"),
AudioCodecInfo(QStringLiteral("Linear PCM"),
kAudioFormatLinearPCM));
supportedCodecs->insert(QStringLiteral("ulaw"),
AudioCodecInfo(QStringLiteral("PCM Mu-Law 2:1"),
kAudioFormatULaw));
supportedCodecs->insert(QStringLiteral("alaw"),
AudioCodecInfo(QStringLiteral("PCM A-Law 2:1"),
kAudioFormatALaw));
supportedCodecs->insert(QStringLiteral("ima4"),
AudioCodecInfo(QStringLiteral("IMA 4:1 ADPCM"),
kAudioFormatAppleIMA4));
supportedCodecs->insert(QStringLiteral("alac"),
AudioCodecInfo(QStringLiteral("Apple Lossless Audio Codec"),
kAudioFormatAppleLossless));
supportedCodecs->insert(QStringLiteral("aac"),
AudioCodecInfo(QStringLiteral("MPEG-4 Low Complexity AAC"),
kAudioFormatMPEG4AAC));
supportedCodecs->insert(QStringLiteral("aach"),
AudioCodecInfo(QStringLiteral("MPEG-4 High Efficiency AAC"),
kAudioFormatMPEG4AAC_HE));
supportedCodecs->insert(QStringLiteral("aacl"),
AudioCodecInfo(QStringLiteral("MPEG-4 AAC Low Delay"),
kAudioFormatMPEG4AAC_LD));
supportedCodecs->insert(QStringLiteral("aace"),
AudioCodecInfo(QStringLiteral("MPEG-4 AAC Enhanced Low Delay"),
kAudioFormatMPEG4AAC_ELD));
supportedCodecs->insert(QStringLiteral("aacf"),
AudioCodecInfo(QStringLiteral("MPEG-4 AAC Enhanced Low Delay with SBR"),
kAudioFormatMPEG4AAC_ELD_SBR));
supportedCodecs->insert(QStringLiteral("aacp"),
AudioCodecInfo(QStringLiteral("MPEG-4 HE AAC V2"),
kAudioFormatMPEG4AAC_HE_V2));
supportedCodecs->insert(QStringLiteral("ilbc"),
AudioCodecInfo(QStringLiteral("iLBC"),
kAudioFormatiLBC));
}
}
QStringList AVFAudioEncoderSettingsControl::supportedAudioCodecs() const
{
return supportedCodecs->keys();
}
QString AVFAudioEncoderSettingsControl::codecDescription(const QString &codecName) const
{
return supportedCodecs->value(codecName).description;
}
QList<int> AVFAudioEncoderSettingsControl::supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous) const
{
Q_UNUSED(settings)
if (continuous)
*continuous = true;
return QList<int>() << 8000 << 96000;
}
QAudioEncoderSettings AVFAudioEncoderSettingsControl::audioSettings() const
{
return m_actualSettings;
}
void AVFAudioEncoderSettingsControl::setAudioSettings(const QAudioEncoderSettings &settings)
{
if (m_requestedSettings == settings)
return;
m_requestedSettings = m_actualSettings = settings;
}
NSDictionary *AVFAudioEncoderSettingsControl::applySettings()
{
if (m_service->session()->state() != QCamera::LoadedState &&
m_service->session()->state() != QCamera::ActiveState) {
return nil;
}
NSMutableDictionary *settings = [NSMutableDictionary dictionary];
QString codec = m_requestedSettings.codec().isEmpty() ? *defaultCodec : m_requestedSettings.codec();
if (!supportedCodecs->contains(codec)) {
qWarning("Unsupported codec: '%s'", codec.toLocal8Bit().constData());
codec = *defaultCodec;
}
[settings setObject:[NSNumber numberWithInt:supportedCodecs->value(codec).id] forKey:AVFormatIDKey];
m_actualSettings.setCodec(codec);
#ifdef Q_OS_OSX
if (m_requestedSettings.encodingMode() == QMultimedia::ConstantQualityEncoding) {
int quality;
switch (m_requestedSettings.quality()) {
case QMultimedia::VeryLowQuality:
quality = AVAudioQualityMin;
break;
case QMultimedia::LowQuality:
quality = AVAudioQualityLow;
break;
case QMultimedia::HighQuality:
quality = AVAudioQualityHigh;
break;
case QMultimedia::VeryHighQuality:
quality = AVAudioQualityMax;
break;
case QMultimedia::NormalQuality:
default:
quality = AVAudioQualityMedium;
break;
}
[settings setObject:[NSNumber numberWithInt:quality] forKey:AVEncoderAudioQualityKey];
} else
#endif
if (m_requestedSettings.bitRate() > 0){
[settings setObject:[NSNumber numberWithInt:m_requestedSettings.bitRate()] forKey:AVEncoderBitRateKey];
}
int sampleRate = m_requestedSettings.sampleRate();
int channelCount = m_requestedSettings.channelCount();
#ifdef Q_OS_IOS
// Some keys are mandatory only on iOS
if (codec == QLatin1String("lpcm")) {
[settings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[settings setObject:[NSNumber numberWithInt:NO] forKey:AVLinearPCMIsBigEndianKey];
[settings setObject:[NSNumber numberWithInt:NO] forKey:AVLinearPCMIsFloatKey];
[settings setObject:[NSNumber numberWithInt:NO] forKey:AVLinearPCMIsNonInterleaved];
}
if (codec == QLatin1String("alac"))
[settings setObject:[NSNumber numberWithInt:24] forKey:AVEncoderBitDepthHintKey];
if (sampleRate <= 0)
sampleRate = codec == QLatin1String("ilbc") ? 8000 : 44100;
if (channelCount <= 0)
channelCount = codec == QLatin1String("ilbc") ? 1 : 2;
#endif
if (sampleRate > 0) {
[settings setObject:[NSNumber numberWithInt:sampleRate] forKey:AVSampleRateKey];
m_actualSettings.setSampleRate(sampleRate);
}
if (channelCount > 0) {
[settings setObject:[NSNumber numberWithInt:channelCount] forKey:AVNumberOfChannelsKey];
m_actualSettings.setChannelCount(channelCount);
}
return settings;
}
void AVFAudioEncoderSettingsControl::unapplySettings()
{
m_actualSettings = m_requestedSettings;
}
QT_END_NAMESPACE

View File

@@ -61,6 +61,7 @@ class AVFImageEncoderControl;
class AVFCameraFlashControl;
class AVFMediaRecorderControl;
class AVFMediaRecorderControlIOS;
class AVFAudioEncoderSettingsControl;
class AVFVideoEncoderSettingsControl;
class AVFMediaContainerControl;
@@ -89,6 +90,7 @@ public:
AVFCameraViewfinderSettingsControl *viewfinderSettingsControl() const {return m_viewfinderSettingsControl; }
AVFImageEncoderControl *imageEncoderControl() const {return m_imageEncoderControl; }
AVFCameraFlashControl *flashControl() const {return m_flashControl; }
AVFAudioEncoderSettingsControl *audioEncoderSettingsControl() const { return m_audioEncoderSettingsControl; }
AVFVideoEncoderSettingsControl *videoEncoderSettingsControl() const {return m_videoEncoderSettingsControl; }
AVFMediaContainerControl *mediaContainerControl() const { return m_mediaContainerControl; }
@@ -109,6 +111,7 @@ private:
AVFCameraViewfinderSettingsControl *m_viewfinderSettingsControl;
AVFImageEncoderControl *m_imageEncoderControl;
AVFCameraFlashControl *m_flashControl;
AVFAudioEncoderSettingsControl *m_audioEncoderSettingsControl;
AVFVideoEncoderSettingsControl *m_videoEncoderSettingsControl;
AVFMediaContainerControl *m_mediaContainerControl;
};

View File

@@ -53,6 +53,7 @@
#include "avfcameraviewfindersettingscontrol.h"
#include "avfimageencodercontrol.h"
#include "avfcameraflashcontrol.h"
#include "avfaudioencodersettingscontrol.h"
#include "avfvideoencodersettingscontrol.h"
#include "avfmediacontainercontrol.h"
@@ -101,6 +102,7 @@ AVFCameraService::AVFCameraService(QObject *parent):
m_viewfinderSettingsControl = new AVFCameraViewfinderSettingsControl(this);
m_imageEncoderControl = new AVFImageEncoderControl(this);
m_flashControl = new AVFCameraFlashControl(this);
m_audioEncoderSettingsControl = new AVFAudioEncoderSettingsControl(this);
m_videoEncoderSettingsControl = new AVFVideoEncoderSettingsControl(this);
m_mediaContainerControl = new AVFMediaContainerControl(this);
}
@@ -134,6 +136,7 @@ AVFCameraService::~AVFCameraService()
delete m_viewfinderSettingsControl;
delete m_imageEncoderControl;
delete m_flashControl;
delete m_audioEncoderSettingsControl;
delete m_videoEncoderSettingsControl;
delete m_mediaContainerControl;
@@ -182,6 +185,9 @@ QMediaControl *AVFCameraService::requestControl(const char *name)
if (qstrcmp(name, QCameraFlashControl_iid) == 0)
return m_flashControl;
if (qstrcmp(name, QAudioEncoderSettingsControl_iid) == 0)
return m_audioEncoderSettingsControl;
if (qstrcmp(name, QVideoEncoderSettingsControl_iid) == 0)
return m_videoEncoderSettingsControl;

View File

@@ -64,6 +64,7 @@ QT_END_NAMESPACE
QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVCaptureDeviceInput> m_audioInput;
QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVCaptureAudioDataOutput> m_audioOutput;
QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVAssetWriterInput> m_audioWriterInput;
AVCaptureDevice *m_audioCaptureDevice;
// High priority serial queue for video output:
QT_PREPEND_NAMESPACE(AVFScopedPointer)<dispatch_queue_t> m_videoQueue;
@@ -87,6 +88,7 @@ QT_END_NAMESPACE
CMTime m_startTime;
CMTime m_lastTimeStamp;
NSDictionary *m_audioSettings;
NSDictionary *m_videoSettings;
}
@@ -95,6 +97,7 @@ QT_END_NAMESPACE
- (bool)setupWithFileURL:(NSURL *)fileURL
cameraService:(QT_PREPEND_NAMESPACE(AVFCameraService) *)service
audioSettings:(NSDictionary *)audioSettings
videoSettings:(NSDictionary *)videoSettings;
- (void)start;

View File

@@ -74,7 +74,6 @@ bool qt_camera_service_isValid(AVFCameraService *service)
- (bool)addAudioCapture;
- (bool)addWriterInputs;
- (void)setQueues;
- (NSDictionary *)audioSettings;
- (void)updateDuration:(CMTime)newTimeStamp;
@end
@@ -98,6 +97,7 @@ bool qt_camera_service_isValid(AVFCameraService *service)
m_startTime = kCMTimeInvalid;
m_lastTimeStamp = kCMTimeInvalid;
m_durationInMs.store(0);
m_audioSettings = nil;
m_videoSettings = nil;
}
@@ -106,6 +106,7 @@ bool qt_camera_service_isValid(AVFCameraService *service)
- (bool)setupWithFileURL:(NSURL *)fileURL
cameraService:(AVFCameraService *)service
audioSettings:(NSDictionary *)audioSettings
videoSettings:(NSDictionary *)videoSettings
{
Q_ASSERT(fileURL);
@@ -116,6 +117,7 @@ bool qt_camera_service_isValid(AVFCameraService *service)
}
m_service = service;
m_audioSettings = audioSettings;
m_videoSettings = videoSettings;
m_videoQueue.reset(dispatch_queue_create("video-output-queue", DISPATCH_QUEUE_SERIAL));
@@ -150,6 +152,7 @@ bool qt_camera_service_isValid(AVFCameraService *service)
[session removeInput:m_audioInput];
m_audioOutput.reset();
m_audioInput.reset();
m_audioCaptureDevice = 0;
}
m_assetWriter.reset();
return false;
@@ -327,20 +330,22 @@ bool qt_camera_service_isValid(AVFCameraService *service)
AVCaptureSession *captureSession = m_service->session()->captureSession();
AVCaptureDevice *audioDevice = m_service->audioInputSelectorControl()->createCaptureDevice();
if (!audioDevice) {
m_audioCaptureDevice = m_service->audioInputSelectorControl()->createCaptureDevice();
if (!m_audioCaptureDevice) {
qWarning() << Q_FUNC_INFO << "no audio input device available";
return false;
} else {
NSError *error = nil;
m_audioInput.reset([[AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error] retain]);
m_audioInput.reset([[AVCaptureDeviceInput deviceInputWithDevice:m_audioCaptureDevice error:&error] retain]);
if (!m_audioInput || error) {
qWarning() << Q_FUNC_INFO << "failed to create audio device input";
m_audioCaptureDevice = 0;
m_audioInput.reset();
return false;
} else if (![captureSession canAddInput:m_audioInput]) {
qWarning() << Q_FUNC_INFO << "could not connect the audio input";
m_audioCaptureDevice = 0;
m_audioInput.reset();
return false;
} else {
@@ -355,6 +360,7 @@ bool qt_camera_service_isValid(AVFCameraService *service)
} else {
qDebugCamera() << Q_FUNC_INFO << "failed to add audio output";
[captureSession removeInput:m_audioInput];
m_audioCaptureDevice = 0;
m_audioInput.reset();
m_audioOutput.reset();
return false;
@@ -388,7 +394,10 @@ bool qt_camera_service_isValid(AVFCameraService *service)
m_cameraWriterInput.data().expectsMediaDataInRealTime = YES;
if (m_audioOutput) {
m_audioWriterInput.reset([[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeAudio outputSettings:[self audioSettings]]);
CMFormatDescriptionRef sourceFormat = m_audioCaptureDevice ? m_audioCaptureDevice.activeFormat.formatDescription : 0;
m_audioWriterInput.reset([[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeAudio
outputSettings:m_audioSettings
sourceFormatHint:sourceFormat]);
if (!m_audioWriterInput) {
qDebugCamera() << Q_FUNC_INFO << "failed to create audio writer input";
// But we still can record video.
@@ -418,20 +427,6 @@ bool qt_camera_service_isValid(AVFCameraService *service)
}
}
- (NSDictionary *)audioSettings
{
// TODO: these settings should be taken from
// the video/audio encoder settings control.
// For now we either take recommended (iOS >= 7.0)
// or nil - this seems to be good enough.
#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_7_0)
if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_7_0 && m_audioOutput)
return [m_audioOutput recommendedAudioSettingsForAssetWriterWithOutputFileType:AVFileTypeQuickTimeMovie];
#endif
return nil;
}
- (void)updateDuration:(CMTime)newTimeStamp
{
Q_ASSERT(CMTimeCompare(m_startTime, kCMTimeInvalid));

View File

@@ -37,6 +37,7 @@
#include "avfcameraservice.h"
#include "avfcameracontrol.h"
#include "avfaudioinputselectorcontrol.h"
#include "avfaudioencodersettingscontrol.h"
#include "avfvideoencodersettingscontrol.h"
#include "avfmediacontainercontrol.h"
@@ -234,6 +235,11 @@ void AVFMediaRecorderControl::applySettings()
return;
}
// Configure audio settings
[m_movieOutput setOutputSettings:m_service->audioEncoderSettingsControl()->applySettings()
forConnection:[m_movieOutput connectionWithMediaType:AVMediaTypeAudio]];
// Configure video settings
AVCaptureConnection *videoConnection = [m_movieOutput connectionWithMediaType:AVMediaTypeVideo];
NSDictionary *videoSettings = m_service->videoEncoderSettingsControl()->applySettings(videoConnection);
@@ -244,6 +250,7 @@ void AVFMediaRecorderControl::applySettings()
void AVFMediaRecorderControl::unapplySettings()
{
m_service->audioEncoderSettingsControl()->unapplySettings();
m_service->videoEncoderSettingsControl()->unapplySettings([m_movieOutput connectionWithMediaType:AVMediaTypeVideo]);
}

View File

@@ -100,6 +100,7 @@ private:
QMediaRecorder::State m_state;
QMediaRecorder::Status m_lastStatus;
NSDictionary *m_audioSettings;
NSDictionary *m_videoSettings;
};

View File

@@ -38,6 +38,7 @@
#include "avfcameracontrol.h"
#include "avfcameraservice.h"
#include "avfcameradebug.h"
#include "avfaudioencodersettingscontrol.h"
#include "avfvideoencodersettingscontrol.h"
#include "avfmediacontainercontrol.h"
#include "avfcamerautility.h"
@@ -80,6 +81,7 @@ AVFMediaRecorderControlIOS::AVFMediaRecorderControlIOS(AVFCameraService *service
, m_service(service)
, m_state(QMediaRecorder::StoppedState)
, m_lastStatus(QMediaRecorder::UnloadedStatus)
, m_audioSettings(nil)
, m_videoSettings(nil)
{
Q_ASSERT(service);
@@ -112,6 +114,8 @@ AVFMediaRecorderControlIOS::~AVFMediaRecorderControlIOS()
{
[m_writer abort];
if (m_audioSettings)
[m_audioSettings release];
if (m_videoSettings)
[m_videoSettings release];
}
@@ -164,8 +168,13 @@ void AVFMediaRecorderControlIOS::applySettings()
return;
}
AVCaptureConnection *conn = [m_service->videoOutput()->videoDataOutput() connectionWithMediaType:AVMediaTypeVideo];
// audio settings
m_audioSettings = m_service->audioEncoderSettingsControl()->applySettings();
if (m_audioSettings)
[m_audioSettings retain];
// video settings
AVCaptureConnection *conn = [m_service->videoOutput()->videoDataOutput() connectionWithMediaType:AVMediaTypeVideo];
m_videoSettings = m_service->videoEncoderSettingsControl()->applySettings(conn);
if (m_videoSettings)
[m_videoSettings retain];
@@ -173,9 +182,15 @@ void AVFMediaRecorderControlIOS::applySettings()
void AVFMediaRecorderControlIOS::unapplySettings()
{
m_service->audioEncoderSettingsControl()->unapplySettings();
AVCaptureConnection *conn = [m_service->videoOutput()->videoDataOutput() connectionWithMediaType:AVMediaTypeVideo];
m_service->videoEncoderSettingsControl()->unapplySettings(conn);
if (m_audioSettings) {
[m_audioSettings release];
m_audioSettings = nil;
}
if (m_videoSettings) {
[m_videoSettings release];
m_videoSettings = nil;
@@ -247,7 +262,9 @@ void AVFMediaRecorderControlIOS::setState(QMediaRecorder::State state)
applySettings();
if ([m_writer setupWithFileURL:nsFileURL cameraService:m_service videoSettings:m_videoSettings]) {
if ([m_writer setupWithFileURL:nsFileURL cameraService:m_service
audioSettings:m_audioSettings
videoSettings:m_videoSettings]) {
m_state = QMediaRecorder::RecordingState;
m_lastStatus = QMediaRecorder::StartingStatus;

View File

@@ -39,7 +39,8 @@ HEADERS += \
avfimageencodercontrol.h \
avfcameraflashcontrol.h \
avfvideoencodersettingscontrol.h \
avfmediacontainercontrol.h
avfmediacontainercontrol.h \
avfaudioencodersettingscontrol.h
OBJECTIVE_SOURCES += \
avfcameraserviceplugin.mm \
@@ -61,7 +62,8 @@ OBJECTIVE_SOURCES += \
avfimageencodercontrol.mm \
avfcameraflashcontrol.mm \
avfvideoencodersettingscontrol.mm \
avfmediacontainercontrol.mm
avfmediacontainercontrol.mm \
avfaudioencodersettingscontrol.mm
osx {