AVFoundation 将 Swift 代码更改为 Objective-C
AVFoundation change Swift code to Objective-C
我找到了 Swift 中编写的 AVFoundation 示例代码。我试图将代码更改为 Objective-C。但我不确定我这样做是否正确,因为代码目前不起作用。你能看一下吗?
func initialiseCaptureSession()
{
captureSession.sessionPreset = AVCaptureSessionPresetPhoto
guard let frontCamera = (AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as! [AVCaptureDevice])
.filter({ [=12=].position == .Front })
.first else
{
fatalError("Unable to access front camera")
}
do
{
let input = try AVCaptureDeviceInput(device: frontCamera)
captureSession.addInput(input)
}
catch
{
fatalError("Unable to access front camera")
}
let videoOutput = AVCaptureVideoDataOutput()
videoOutput.setSampleBufferDelegate(self, queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL))
if captureSession.canAddOutput(videoOutput)
{
captureSession.addOutput(videoOutput)
}
captureSession.startRunning()
}
我的Objective-C代码:
-(void)initializeCaptureSession {
self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto;
AVCaptureDevice *inputDevice = nil;
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *deviceInput;
for(AVCaptureDevice *camera in devices) {
if([camera position] == AVCaptureDevicePositionFront) { // is front camera
inputDevice = camera;
deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:nil];
[self.captureSession addInput:deviceInput];
break;
}
}
AVCaptureVideoDataOutput *videoOutput = nil;
[videoOutput setSampleBufferDelegate:self queue:dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL)];
if([self.captureSession canAddOutput:videoOutput]) {
[self.captureSession addOutput:videoOutput];
}
[self.captureSession startRunning];
}
问题是,就我而言
if([self.captureSession canAddOutput:videoOutput]) {
[self.captureSession addOutput:videoOutput];
}
被忽略。我不确定,但是我的 self.captureSession addInput:deviceInput]; 有问题吗?
此致,
纳扎尔
这行有问题
AVCaptureVideoDataOutput *videoOutput = nil;
AVCaptureVideoDataOutput
未初始化,因此 canAddOutput:videoOutput
失败。
你可以这样初始化它;
videoOutput = [[AVCaptureVideoDataOutput alloc] init];
我找到了 Swift 中编写的 AVFoundation 示例代码。我试图将代码更改为 Objective-C。但我不确定我这样做是否正确,因为代码目前不起作用。你能看一下吗?
func initialiseCaptureSession()
{
captureSession.sessionPreset = AVCaptureSessionPresetPhoto
guard let frontCamera = (AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as! [AVCaptureDevice])
.filter({ [=12=].position == .Front })
.first else
{
fatalError("Unable to access front camera")
}
do
{
let input = try AVCaptureDeviceInput(device: frontCamera)
captureSession.addInput(input)
}
catch
{
fatalError("Unable to access front camera")
}
let videoOutput = AVCaptureVideoDataOutput()
videoOutput.setSampleBufferDelegate(self, queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL))
if captureSession.canAddOutput(videoOutput)
{
captureSession.addOutput(videoOutput)
}
captureSession.startRunning()
}
我的Objective-C代码:
-(void)initializeCaptureSession {
self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto;
AVCaptureDevice *inputDevice = nil;
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *deviceInput;
for(AVCaptureDevice *camera in devices) {
if([camera position] == AVCaptureDevicePositionFront) { // is front camera
inputDevice = camera;
deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:nil];
[self.captureSession addInput:deviceInput];
break;
}
}
AVCaptureVideoDataOutput *videoOutput = nil;
[videoOutput setSampleBufferDelegate:self queue:dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL)];
if([self.captureSession canAddOutput:videoOutput]) {
[self.captureSession addOutput:videoOutput];
}
[self.captureSession startRunning];
}
问题是,就我而言
if([self.captureSession canAddOutput:videoOutput]) {
[self.captureSession addOutput:videoOutput];
}
被忽略。我不确定,但是我的 self.captureSession addInput:deviceInput]; 有问题吗?
此致, 纳扎尔
这行有问题
AVCaptureVideoDataOutput *videoOutput = nil;
AVCaptureVideoDataOutput
未初始化,因此 canAddOutput:videoOutput
失败。
你可以这样初始化它;
videoOutput = [[AVCaptureVideoDataOutput alloc] init];