BlackMagic DeckLink SDK を使用して、BM デバイスからフレームをキャプチャしようとしています。
IDeckLinkVideoInputFrame
コールバックでからピクセル データを取得し、DeckLinkController::VideoInputFrameArrived
それを に変換して、 AVFoundation のとCVPixelBufferRef
でディスクに書き込めるようにしようとしています。ディスクに書き込まれたすべてのフレームが緑色であるという事実を除けば、私が使用しているコードは機能しているようです。(画面上にプレビューを生成する BlackMagic のサンプル コードは画像を表示するため、デバイスとデバイスの設定は問題ないはずです)。AVAssetWriterInputPixelBufferAdaptor
AVAssetWriter
は次のAVAssetWriter
ように設定されます。
writer = [[AVAssetWriter assetWriterWithURL:destinationUrl
fileType:AVFileTypeAppleM4V
error:&error] retain];
if(error)
NSLog(@"ERROR: %@", [error localizedDescription]);
NSMutableDictionary * outputSettings = [[NSMutableDictionary alloc] init];
[outputSettings setObject: AVVideoCodecH264
forKey: AVVideoCodecKey];
[outputSettings setObject: [NSNumber numberWithInt:1920]
forKey: AVVideoWidthKey];
[outputSettings setObject: [NSNumber numberWithInt:1080]
forKey: AVVideoHeightKey];
NSMutableDictionary * compressionProperties = [[NSMutableDictionary alloc] init];
[compressionProperties setObject: [NSNumber numberWithInt: 1000000]
forKey: AVVideoAverageBitRateKey];
[compressionProperties setObject: [NSNumber numberWithInt: 16]
forKey: AVVideoMaxKeyFrameIntervalKey];
[compressionProperties setObject: AVVideoProfileLevelH264Main31
forKey: AVVideoProfileLevelKey];
[outputSettings setObject: compressionProperties
forKey: AVVideoCompressionPropertiesKey];
writerVideoInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings] retain];
NSMutableDictionary * pixBufSettings = [[NSMutableDictionary alloc] init];
[pixBufSettings setObject: [NSNumber numberWithInt: kCVPixelFormatType_422YpCbCr8_yuvs]
forKey: (NSString *) kCVPixelBufferPixelFormatTypeKey];
[pixBufSettings setObject: [NSNumber numberWithInt: 1920]
forKey: (NSString *) kCVPixelBufferWidthKey];
[pixBufSettings setObject: [NSNumber numberWithInt: 1080]
forKey: (NSString *) kCVPixelBufferHeightKey];
writerVideoInput.expectsMediaDataInRealTime = YES;
writer.shouldOptimizeForNetworkUse = NO;
adaptor = [[AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerVideoInput
sourcePixelBufferAttributes:pixBufSettings] retain];
[writer addInput:writerVideoInput];
参考までに、これらの出力設定と圧縮オプションは正しいはずですが、いくつかの異なる方法を試しました。
フレームがデバイスから受信されると、次のように に変換しCVPixelBufferRef
ます。
void *videoData;
int64_t frameTime;
int64_t frameDuration;
videoFrame->GetBytes(&videoData);
videoFrame->GetStreamTime(&frameTime, &frameDuration, 3000);
CMTime presentationTime = CMTimeMake(frameDuration, 3000);
CVPixelBufferRef buffer = NULL;
CVPixelBufferPoolCreatePixelBuffer(NULL, adaptor.pixelBufferPool, &buffer);
CVPixelBufferLockBaseAddress(buffer, 0);
void *rasterData = CVPixelBufferGetBaseAddress(buffer);
memcpy(rasterData, videoData, (videoFrame->GetRowBytes()*videoFrame->GetHeight()));
CVPixelBufferUnlockBaseAddress(buffer, 0);
if (buffer)
{
if(![adaptor appendPixelBuffer:buffer withPresentationTime:presentationTime]) {
NSLog(@"ERROR appending pixelbuffer: %@", writer.error);
[writerVideoInput markAsFinished];
if(![writer finishWriting])
NSLog(@"ERROR finishing writing: %@", [writer.error localizedDescription]);
}
else {
NSLog(@"SUCCESS");
if(buffer)
CVPixelBufferRelease(buffer);
}
}
このコードは AVAssetWriterInputPixelBufferAdaptor にフレームを追加していますが、すべてのフレームが緑色です。
ここで私が間違っていることを誰かが理解できますか、または BlackMagic Decklink SDK を使用してフレームをキャプチャおよび圧縮する AVFoundation を使用した経験がある人はいますか?