11

Mac OS X の Web カメラから受信したビデオをミラーリングしようとしています。ビデオ バッファを受け取った後に手動でフリップ/変換を行うことは避けたいと思います。そこで、 のメソッドでAVCaptureSession受け取ったビデオバッファをAVFoundation 自身がミラーリングするように設定したい。プレビュー レイヤーを使用したくありません。captureOutputAVCaptureVideoDataOutputSampleBufferDelegate

iMac (10.8.5) では、プロパティAVCaptureConnection isVideoMirroringSupportedを設定する前にビデオをミラーリングすることが正常にテストされていvideoMirroredます。captureOutputただし、デリゲートで受信したビデオ バッファーはミラーリングされません。

注:この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 -この 2010 wwdc Apple プレゼンテーション (3Mb pdf) のスライド 73 には、setVideoOrientation「AVCaptureVideoDataOutput」接続ではサポートされていないという記述があります。しかし、2013 年に Appleドキュメントが更新され、この方法がサポートされました。

4

3 に答える 3

6

プレビュー レイヤーに変換を追加して、フレームがプレビュー ウィンドウに表示される前にフレームの x 値を反転できます。

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

次に、エクスポート セッションを介して録画したビデオを実行し、同じ変換を行うことができます。そうすれば、ビデオ プレビューは最終的に記録されたビデオと一致します。少しハックですが、同じ結果が得られます。

于 2014-10-23T16:47:05.413 に答える
4

非常に簡単なのに、なぜそれをハックするのか。AVCaptureConnection の自動的に AdjustVideoMirroring を設定してから、手動で設定するだけです。

    aPreviewLayer.connection.automaticallyAdjustsVideoMirroring = NO;
    aPreviewLayer.connection.videoMirrored = YES;
于 2015-06-07T17:15:12.313 に答える