无视频输出和 [MC] 从公共有效用户设置中读取。 Swift/iOS 11 中的错误
Posted
技术标签:
【中文标题】无视频输出和 [MC] 从公共有效用户设置中读取。 Swift/iOS 11 中的错误【英文标题】:No Video Output and [MC] Reading from public effective user settings. Error in Swift/iOS 11 【发布时间】:2017-06-09 01:40:13 【问题描述】:使用适用于 ios 11 的 Xcode 9 Beta:
我关注了walkthrough,了解如何从 AVCaptureSession 中提取帧,但无法让捕获出现。虽然我在 info.plist 文件中包含了相机权限,但应用程序在打开后似乎停止并且我收到以下错误:
[App Name] 没有 frZQaeyWLUvLjeuEK43hmg 的沙盒访问权限,并且没有适当的权限
[MC] systemgroup.com.apple.configurationprofiles 路径的系统组容器是 /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
[MC] 从公共有效用户设置中读取。
这是 FrameExtractor.swift 的代码供参考:
import UIKit
import AVFoundation
protocol FrameExtractorDelegate: class
func captured(image: UIImage)
class FrameExtractor: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate
private let position = AVCaptureDevice.Position.front
private let quality = AVCaptureSession.Preset.medium
private var permissionGranted = false
private let sessionQueue = DispatchQueue(label: "session queue")
private let captureSession = AVCaptureSession()
private let context = CIContext()
weak var delegate: FrameExtractorDelegate?
override init()
super.init()
checkPermission()
sessionQueue.async [unowned self] in
self.configureSession()
self.captureSession.startRunning()
// MARK: AVSession configuration
private func checkPermission()
switch AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
case .authorized:
permissionGranted = true
case .notDetermined:
requestPermission()
default:
permissionGranted = false
private func requestPermission()
sessionQueue.suspend()
AVCaptureDevice.requestAccess(for: AVMediaType.video) [unowned self] granted in
self.permissionGranted = granted
self.sessionQueue.resume()
private func configureSession()
guard permissionGranted else return
captureSession.sessionPreset = quality
guard let captureDevice = selectCaptureDevice() else return
guard let captureDeviceInput = try? AVCaptureDeviceInput(device: captureDevice) else return
guard captureSession.canAddInput(captureDeviceInput) else return
captureSession.addInput(captureDeviceInput)
let videoOutput = AVCaptureVideoDataOutput()
videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "sample buffer"))
guard captureSession.canAddOutput(videoOutput) else return
captureSession.addOutput(videoOutput)
guard let connection = videoOutput.connection(with: AVFoundation.AVMediaType.video) else return
guard connection.isVideoOrientationSupported else return
guard connection.isVideoMirroringSupported else return
connection.videoOrientation = .portrait
connection.isVideoMirrored = position == .front
private func selectCaptureDevice() -> AVCaptureDevice?
return AVCaptureDevice.default(for: AVMediaType.video)
// return AVCaptureDevice.devices().filter
// ($0 as AnyObject).hasMediaType(AVMediaType.video) &&
// ($0 as AnyObject).position == position
// .first
// MARK: Sample buffer to UIImage conversion
private func imageFromSampleBuffer(sampleBuffer: CMSampleBuffer) -> UIImage?
guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else return nil
let ciImage = CIImage(cvPixelBuffer: imageBuffer)
guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else return nil
return UIImage(cgImage: cgImage)
// MARK: AVCaptureVideoDataOutputSampleBufferDelegate
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!)
print("Got a Frame!")
guard let uiImage = imageFromSampleBuffer(sampleBuffer: sampleBuffer) else return
DispatchQueue.main.async [unowned self] in
self.delegate?.captured(image: uiImage)
对于 ViewController.swift:
import UIKit
class ViewController: UIViewController, FrameExtractorDelegate
@IBOutlet var imageView: UIImageView!
var frameExtractor: FrameExtractor!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
frameExtractor = FrameExtractor()
frameExtractor.delegate = self
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func captured(image: UIImage)
imageView.image = image
`
【问题讨论】:
【参考方案1】:问题在于 captureOutput 中的另一个函数调用。这是 iOS 11 中对 AVCaptureVideoDataOutputSampleBufferDelegate 中的 captureOutput 的新函数调用:
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
guard let uiImage = imageFromSampleBuffer(sampleBuffer: sampleBuffer) else return
DispatchQueue.main.async [unowned self] in
self.delegate?.captured(image: uiImage)
注意“didOutput sampleBuffer:”和“didOutputSampleBuffer sampleBuffer:”之间的变化
【讨论】:
以上是关于无视频输出和 [MC] 从公共有效用户设置中读取。 Swift/iOS 11 中的错误的主要内容,如果未能解决你的问题,请参考以下文章
错误消息:[MC] 从公共有效用户设置中读取和 [MC] systemgroup.com.apple.configurationprofiles 路径的系统组容器是
如何在 android 上播放 webrtc.AudioTrack(无视频)