我正在使用WKWebView在我的应用程序中显示全屏YouTube视频,并使用AVCaptureSession在YouTube上浏览和播放视频时在后台录制音频和视频.按下按钮时捕获会话开始.但是,在录制过程中,当选择YouTube视频并开始全屏播放时,它会立即意外结束录制,因为会调用处理录制结束的委托方法.
请有人向我解释如何解决这个问题?不太确定这是否完全相关,但我收到错误信息,如_BSMachError:(os / kern)无效功能(20)_BSMachError:(os / kern)无效名称(15)和无法同时满足约束.,尽管后者似乎引用了一个单独的AutoLayout问题.任何帮助将不胜感激.
此外,我尝试使用UIWebView而不是WKWebView.当我使用UIWebView时,问题是视频录制时YouTube视频甚至无法播放.它将在黑屏上打开并保持在0:00.
这是按下以开始录制的按钮.
- (void) buttonClickedStart:(UIButton*)sender //button to start/end recording { if (!WeAreRecording) { [self setupVideoCapture]; //----- START RECORDING ----- WeAreRecording = YES; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil]; //Create temporary URL to record the video to for later viewing NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); Nsstring *basePath = [paths objectAtIndex:0]; Nsstring *outputPath = [[Nsstring alloc] initWithFormat:@"%@",[basePath stringByAppendingPathComponent:@"output.mp4"]]; if ([[NSFileManager defaultManager] isDeletableFileAtPath:outputPath]) [[NSFileManager defaultManager] removeItemAtPath:outputPath error:NULL]; NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath]; [MovieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; self.outputURLs = outputURL; } else { //----- STOP RECORDING ----- WeAreRecording = NO; [MovieFileOutput stopRecording]; } }
这是按下按钮时调用的方法.它设置并启动表示为CaptureSession的捕获会话.
- (void)setupVideoCapture { // Sets up recording capture session CaptureSession = [[AVCaptureSession alloc] init]; // Add video input to capture session AVCaptureDevice *VideoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if (VideoDevice) { NSError *error; VideoInputDevice = [[AVCaptureDeviceInput alloc] initWithDevice:[self CameraWithPosition:AVCaptureDevicePositionFront] error:&error]; if (!error) { if ([CaptureSession canAddInput:VideoInputDevice]) [CaptureSession addInput:VideoInputDevice]; } } // Add audio input to capture session AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; NSError *error = nil; AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error]; if (audioInput) { [CaptureSession addInput:audioInput]; } // Add movie file output to the capture session MovieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; [MovieFileOutput setMovieFragmentInterval:kCMTimeInvalid]; if ([CaptureSession canAddOutput:MovieFileOutput]) [CaptureSession addOutput:MovieFileOutput]; // Set the output properties (you don't really need to see this code) [self CameraSetoutputProperties]; // (We call a method as it also has to be done after changing camera) [CaptureSession setSessionPreset:AVCaptureSessionPresetMedium]; //----- START THE CAPTURE SESSION RUNNING ----- [CaptureSession startRunning]; }
这是声明和设置WKWebView的地方.
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // Add recording button CGSize screenSize = [[UIScreen mainScreen] bounds].size; CGRect rect = CGRectMake(0,screenSize.width,337); UIButton *start = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [start addTarget:self action:@selector(buttonClickedStart:) forControlEvents:UIControlEventTouchUpInside]; [start setFrame:CGRectMake(30,338,35,35)]; [start setTitle:@"" forState:UIControlStatenormal]; [start setExclusivetouch:YES]; [start setBackgroundImage:[UIImage imageNamed:@"start.png"] forState:UIControlStatenormal]; [self.view addSubview:start]; // Add web view webView = [[WKWebView alloc] initWithFrame:rect]; [self.view addSubview:webView]; Nsstring *webSite = @"http://www.youtube.com"; NSURL *url = [NSURL URLWithString:webSite]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; webView.navigationDelegate = self; webView.UIDelegate = self; [webView loadRequest:request]; // Load up Youtube [self.view addSubview:webView]; }
解决方法
看起来唯一缺少的是在其他选项中设置混音,在音频会话中播放和录制类别.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];
编辑:设置一个简单的测试,它的工作原理,希望这有帮助!