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

问题描述 投票:9回答:3

[我正在尝试在Mac OS X上镜像从网络摄像头收到的视频。接收视频缓冲区后,我想避免进行手动翻转/转换。因此,我想设置AVCaptureSession,以使AVFoundation自身镜像在captureOutputAVCaptureVideoDataOutputSampleBufferDelegate方法中接收的视频缓冲区。我不想使用预览层。

在iMac(10.8.5)上,要镜像视频,在设置AVCaptureConnection isVideoMirroringSupported属性之前,已成功测试videoMirrored。但是captureOutput委托中接收的视频缓冲区未镜像。

注意:当我按照this SO回答时,iOS上的视频镜像成功。但这对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 2010 wwdc苹果演示文稿(3Mb pdf)的幻灯片73中,提到“ AVCaptureVideoDataOutput”连接不支持setVideoOrientation。但是在2013年,苹果docs已更新并支持此方法。

macos avfoundation webcam-capture
3个回答
7
投票

您可以在预览层上添加变换以翻转帧的x值,然后再进入预览窗口。

[[self previewLayer] setTransform:CATransform3DMakeScale(-1, 1, 1)];

然后,您可以在导出会话中运行录制的视频并进行相同的转换。这样,视频预览将与最终录制的视频匹配。有点骇人听闻,但结果却相同。


4
投票

为什么很简单,为什么要破解呢?只需自动设置AVCaptureConnection的AdjustVideoMirroring,然后手动设置即可。

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

0
投票

Swift 5版本的“ÞorvaldurRúnarsson”答案:

previewLayer.connection?.automaticallyAdjustsVideoMirroring = false
previewLayer.connection?.isVideoMirrored = true
© www.soinside.com 2019 - 2024. All rights reserved.