Mac OS X の Web カメラから受信したビデオをミラーリングしようとしています。ビデオ バッファを受け取った後に手動でフリップ/変換を行うことは避けたいと思います。そこで、 のメソッドでAVCaptureSession
受け取ったビデオバッファをAVFoundation 自身がミラーリングするように設定したい。プレビュー レイヤーを使用したくありません。captureOutput
AVCaptureVideoDataOutputSampleBufferDelegate
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ドキュメントが更新され、この方法がサポートされました。