【问题标题】:AVCaptureSession Record Video With AudioAVCaptureSession 录制视频和音频
【发布时间】:2012-05-08 12:31:59
【问题描述】:

我将我的应用设置为使用 AVCaptureSession 从摄像头录制视频,但是它没有音频。我需要做什么来录制音频,然后将其添加到文件的 videoOutput 中?这是我录制视频的代码:

AVCaptureSession *session = [[AVCaptureSession alloc] init];
[session beginConfiguration];
session.sessionPreset = AVCaptureSessionPresetMedium;

CALayer *viewLayer = self.vImagePreview.layer;
NSLog(@"viewLayer = %@", viewLayer);

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
captureVideoPreviewLayer.frame = self.vImagePreview.bounds;

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];

AVCaptureDevice *device = [self frontFacingCameraIfAvailable];

NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (!input) {
    // Handle the error appropriately.
    NSLog(@"ERROR: trying to open camera: %@", error);
}

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];

AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];

NSString *archives = [documentsDirectoryPath stringByAppendingPathComponent:@"archives"];
NSString *outputpathofmovie = [[archives stringByAppendingPathComponent:@"Test"] stringByAppendingString:@".mp4"];
NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputpathofmovie];

[session addInput:input];
[session addOutput:movieFileOutput];
[session commitConfiguration];
[session startRunning];
[movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];

我为音频添加了另一个输入,但它不适用于后台的 mpmovieplayercontroller。有什么想法可以播放一个视频并同时从相机录制音频和视频吗?

【问题讨论】:

  • @MDT 那我该怎么办?如果您要花时间发布链接,为什么不将其设为您认为对我有帮助的链接?
  • 查看添加的最后一段以进行编辑

标签: ios objective-c audio-recording avcapturesession avcapturedevice


【解决方案1】:

您没有包含音频设备:

AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
[session addInput:audioInput]

beginConfigurationcommitConfiguration 之间。会成功的!!!

【讨论】:

  • 由于某种原因,当我添加 AudioInput 并开始录制时,预览冻结并且视频输出文件不断报告 0 秒的录制片段...只要我将音频注释掉,它就会再次开始工作:(
【解决方案2】:

beginConfiguration()commitConfiguration()之间添加以下代码

// Add audio device to the recording

let audioDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)
do {
    let audioInput = try AVCaptureDeviceInput(device: audioDevice)
    self.captureSession.addInput(audioInput)
} catch {
    print("Unable to add audio device to the recording.")
}

【讨论】:

  • 问题是关于 ObjectiveC 而不是 Swift
【解决方案3】:

在 swift 5x 中,你可以使用这个:

do {
        guard let audioDevice = AVCaptureDevice.default(for: AVMediaType.audio) else {
            print("Default audio device is unavailable.")
            setupResult = .configurationFailed
            session.commitConfiguration()
            return
        }

        // Add audio input
        let audioInput = try AVCaptureDeviceInput(device: audioDevice)
        if session.canAddInput(audioInput) {
            session.addInput(audioInput)
        } else {
            print("Couldn't add audio device input to the session.")
            setupResult = .configurationFailed
            session.commitConfiguration()
            return
        }

    } catch {
        print("Couldn't create Audio device input: \(error)")
        setupResult = .configurationFailed
        session.commitConfiguration()
        return
    }

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 2012-03-19
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多