在播放其他视频时录制视频

Record video while other video is playing

我正在使用 UIImagePickerController 录制视频。并且正在使用 AVPlayer 播放视频。并将 AVPlayerLayer 添加到 UIImagePickerController's cameraOverlayView 以便我可以在录制时看到视频。 我的要求是

  1. 我需要在使用 UIImagePickerController
  2. 录制视频的同时观看视频
  3. 使用耳机我需要通过播放视频收听音频
  4. 需要将我的声音录制到录制视频中
  5. 只有我的声音应该被录制而不是播放视频的音频。

除了 4. 播放视频的音频也与我的声音混合在一起,一切正常。如何处理这种情况?我的最终目标是

  1. 播放视频的输出是耳机
  2. 录音输入为耳机麦克风

请帮我完成这件事。

你的要求很有趣。所以你需要同时播放和录制,对吧? 因此,您需要使用类别 AVAudioSessionCategoryPlayAndRecord.

初始化音频会话
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

因为您正在使用 UIImagePickerController 进行录音,所以您对扬声器和麦克风没有太多控制权。所以测试看看它是否有效。

如果您还有问题,我建议您使用AVCaptureSession来录制无声视频。看这个例子怎么用record-video-with-avcapturesession-2.

更新:在我的 VOIP 应用程序中,我使用 AVAudioUnit 在播放时进行录音。所以我认为唯一的办法就是分别录制视频和音频,然后使用 AVComposition 将其合成为一部电影。使用 AVCaptureSession 仅录制视频,使用 EZAudio 录制音频。 EZAudio 使用 AVAudioUnit 进行记录,这样它就可以工作了。您可以通过在播放电影时录制音频来测试它,看看它是否有效。希望对你有帮助

更新:我测试过,它只有在你使用耳机或 select 麦克风后方时才有效。 这是测试代码:

    NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"videoviewdemo" ofType:@"mp4"];
    NSURL *url = [NSURL fileURLWithPath:moviePath];
    // You may find a test stream at <http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8>.
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];

    AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
    AVPlayerLayer *layer = [[AVPlayerLayer alloc] init];
    [layer setPlayer:player];
    [layer setFrame:CGRectMake(0, 0, 100, 100)];
    [self.view.layer addSublayer:layer];

    [player play];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //
        // Setup the AVAudioSession. EZMicrophone will not work properly on iOS
        // if you don't do this!
        //
        AVAudioSession *session = [AVAudioSession sharedInstance];
        NSError *error;
        [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
        if (error)
        {
            NSLog(@"Error setting up audio session category: %@", error.localizedDescription);
        }
        [session setActive:YES error:&error];
        if (error)
        {
            NSLog(@"Error setting up audio session active: %@", error.localizedDescription);
        }

        //
        // Customizing the audio plot's look
        //
        // Background color
        self.audioPlot.backgroundColor = [UIColor colorWithRed:0.984 green:0.471 blue:0.525 alpha:1.0];

        // Waveform color
        self.audioPlot.color = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];

        // Plot type
        self.audioPlot.plotType = EZPlotTypeBuffer;

        //
        // Create the microphone
        //
        self.microphone = [EZMicrophone microphoneWithDelegate:self];

        //
        // Set up the microphone input UIPickerView items to select
        // between different microphone inputs. Here what we're doing behind the hood
        // is enumerating the available inputs provided by the AVAudioSession.
        //
        self.inputs = [EZAudioDevice inputDevices];
        self.microphoneInputPickerView.dataSource = self;
        self.microphoneInputPickerView.delegate = self;

        //
        // Start the microphone
        //
        [self.microphone startFetchingAudio];
        self.microphoneTextLabel.text = @"Microphone On";

        [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
    });

看看PBJVision library。它允许您在观看预览的同时录制视频,并且在最后,您可以对音频和视频素材做任何您想做的事情。