我正在使用 Swift 创建一个 iOS 本机应用程序。
该应用程序有一个 UIView,其中包含 WKWebVeiw 的前 50%,它加载 YouTube 视频 URL(我还尝试了 Google 的 youtube_ios_player_helper YTPlayerView,它基本上也是一个 WKWebView)
在 UIView 的下半部分,我嵌入了 AVCaptureVideoPreviewLayer,它显示了我的 iPhone 摄像头前面的内容。
同时我初始化了SFSpeechRecognizer来捕获用户的声音。
在我按下 WKWebView 中的 YouTube“播放”按钮之前,AVCaptureVideoPreviewLayer 和 SFSpeechRecognizer 工作正常
但是,一旦我在 WKWebView 中按下 YouTube“播放”按钮(YouTube 视频开始播放),AVCaptureVideoPreviewLayer 就会冻结,SFSpeechRecognizer 就会停止工作。
以下是我如何创建 WKWebView 来加载 YouTube 视频:
var youTubePlayerWebView: WKWebView! = WKWebView(frame: CGRect(x: videoplayerX, y: videoplayerY, width: videoplayerWidth, height: videoplayerHeight))
youTubePlayerWebView.load(URLRequest(url: videoUrl))
self.view.addSubview(youTubePlayerWebView)
以下是我如何创建相机
self.previewLayer = AVCaptureVideoPreviewLayer(session: self.session!)
self.previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
self.previewLayer?.connection!.videoOrientation = AVCaptureVideoOrientation.portrait
self.previewLayer?.frame = self.cameraPreview.bounds
self.cameraPreview.layer.addSublayer(self.previewLayer!)
self.session?.startRunning()
以下是我监听用户声音的方法:
guard let node = audioEngine?.inputNode else { return }
let recordingFormat = node.outputFormat (forBus: 0)
node.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
self.request.append (buffer)
}
audioEngine?.prepare ()
do {
try audioEngine?.start()
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(AVAudioSession.Category.playAndRecord)
try audioSession.setMode(AVAudioSession.Mode.default)
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
} catch {
return print (error)
}
recognitionTask = speechRecognizer?.recognitionTask(with: request, resultHandler: { result, error in
if let result = result {
//....voice recognition logic
我需要一种方法,让我的摄像头和麦克风在 WKWebView 播放 YouTube 视频时继续工作。
好吧,我明白了,答案如下: 当初始化 AVCaptureSession 的会话以进行相机视频捕获时,我需要设置:
AVCaptureSession?.automaticallyConfiguresApplicationAudioSession = false
当为 SFSpeechRecognizer 初始化 AVAudioSession 的会话时,我需要设置:
AVAudioSession.setCategory(AVAudioSession.Category.playAndRecord, options: [.mixWithOthers, .duckOthers])