gpt4 book ai didi

macos - AVFoundation - 如何从网络摄像头镜像视频 - Mac OS X

转载 作者:行者123 更新时间:2023-12-04 11:24:19 24 4
gpt4 key购买 nike

我正在尝试在 mac os x 上镜像从网络摄像头收到的视频。我想避免在收到视频缓冲区后进行手动翻转/转换。所以,我想设置AVCaptureSession这样在 captureOutput 中接收到的视频缓冲区AVCaptureVideoDataOutputSampleBufferDelegate的方法由 AVFoundation 本身镜像。我不想使用预览层。

在 iMac(10.8.5) 上,镜像视频,AVCaptureConnection isVideoMirroringSupported在设置 videoMirrored 之前已成功测试属性(property)。但是在 captureOutput 中接收到视频缓冲区代表没有镜像。

注意:iOS上的视频镜像是成功的,当我关注this时所以回答。但这对 mac os x 没有帮助。

使用的代码如下。这篇文章省略了错误检查。

    //create session
_session = [[AVCaptureSession alloc] init];

//get capture device
_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

//create sesion input
NSError * error;
_sessionInput = [AVCaptureDeviceInput deviceInputWithDevice:_device error:&error];

//create session output
_sessionOutput = [[AVCaptureVideoDataOutput alloc] init];
[_sessionOutput setAlwaysDiscardsLateVideoFrames:YES];
[[_sessionOutput connectionWithMediaType:AVMediaTypeVideo] setEnabled:YES];
NSDictionary *videoSettings = [NSDictionary dictionaryWithObject: [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
[_sessionOutput setVideoSettings:videoSettings];

//serial queue to process video frames
dispatch_queue_t videoOutputQueue = dispatch_queue_create("deviceeraQueue", DISPATCH_QUEUE_SERIAL);
[_sessionOutput setSampleBufferDelegate:self queue:videoOutputQueue];

//begin session configuration
[_session beginConfiguration ];

//input and output for session
if( [_session canAddInput:_sessionInput]) {
[_session addInput:_sessionInput];
}
if( [_session canAddOutput:_sessionOutput]) {
[_session addOutput:_sessionOutput];

}

//set video mirroring
AVCaptureConnection* avConnection = [_sessionOutput connectionWithMediaType:AVMediaTypeVideo];
if( [avConnection isVideoMirroringSupported]) {
avConnection.videoMirrored = YES;
NSLog(@"Video mirroring Support: YES"); // this line is printed
} else {
NSLog(@"Video mirroring Support: NO");
}

//set session preset
[_session setSessionPreset:AVCaptureSessionPreset640x480];
[ _session commitConfiguration ];

...........
...........

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
.........
//sampleBuffer is not mirrored video
........

次要的 1 - 虽然是 C++,但我也尝试研究 OpenCV 的 VideoCapture 实现以获取镜像视频的方法。但是,OpenCV 不会从 Mac 镜像视频(使用翻转)。左边是 libVlc/V4L。

次要的 2 - 在 this 的幻灯片 73 中2010 wwdc 苹果演示文稿(3Mb pdf),其中提到 setVideoOrientation 'AVCaptureVideoDataOutput` 连接不支持。但2013年,苹果 docs已更新并支持此方法。

最佳答案

当它很容易时,为什么要破解它。只需设置您的 AVCaptureConnection 的自动调整视频镜像,然后手动设置。

    aPreviewLayer.connection.automaticallyAdjustsVideoMirroring = NO;
aPreviewLayer.connection.videoMirrored = YES;

关于macos - AVFoundation - 如何从网络摄像头镜像视频 - Mac OS X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23696773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com