2

BlackMagic DeckLink SDK を使用して、BM デバイスからフレームをキャプチャしようとしています。

IDeckLinkVideoInputFrameコールバックでからピクセル データを取得し、DeckLinkController::VideoInputFrameArrivedそれを に変換して、 AVFoundation のとCVPixelBufferRefでディスクに書き込めるようにしようとしています。ディスクに書き込まれたすべてのフレームが緑色であるという事実を除けば、私が使用しているコードは機能しているようです。(画面上にプレビューを生成する BlackMagic のサンプル コードは画像を表示するため、デバイスとデバイスの設定は問題ないはずです)。AVAssetWriterInputPixelBufferAdaptorAVAssetWriter

は次の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 を使用した経験がある人はいますか?

4

1 に答える 1