summaryrefslogtreecommitdiffstats
path: root/src/plugins/avfoundation/camera/avfmediaassetwriter.mm
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@theqtcompany.com>2016-02-11 04:34:57 +0100
committerYoann Lopes <yoann.lopes@qt.io>2016-06-09 12:28:24 +0000
commitf5de14107094080f15fad3beffb64ad95ff6c5e4 (patch)
treed85d067035493926f30054f0f934954593004ce3 /src/plugins/avfoundation/camera/avfmediaassetwriter.mm
parent2303d2fef8987f32b1615710ef8930f8d2854373 (diff)
AVFoundation: implement QAudioEncoderSettings.
Change-Id: I24d3da1417142bc80bc6b6c1c8124c246afe03db Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com> Reviewed-by: Christian Stromme <christian.stromme@qt.io>
Diffstat (limited to 'src/plugins/avfoundation/camera/avfmediaassetwriter.mm')
-rw-r--r--src/plugins/avfoundation/camera/avfmediaassetwriter.mm33
1 files changed, 14 insertions, 19 deletions
diff --git a/src/plugins/avfoundation/camera/avfmediaassetwriter.mm b/src/plugins/avfoundation/camera/avfmediaassetwriter.mm
index 8e49c7c8f..396de8c35 100644
--- a/src/plugins/avfoundation/camera/avfmediaassetwriter.mm
+++ b/src/plugins/avfoundation/camera/avfmediaassetwriter.mm
@@ -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));