1

CVImageBufferRef を受け取り、処理のために VTCompressionSession に渡す関数があります。

VTCompressionSession が開始され、VTCompressionSessionCreate への呼び出しが成功しました。

写真ライブラリからビデオ URL を取得し、次を使用して処理しています。

- (void)processImageBuffersFromURL:(NSURL *)url withBlock:(void (^)(CVImageBufferRef bufferRef))block {
    AVAsset *asset = [AVAsset assetWithURL:url];
    AVAssetTrack *track = [[asset
                            tracksWithMediaType:AVMediaTypeVideo]
                           objectAtIndex:0];

    AVAssetReaderTrackOutput
    *readerTrack = [AVAssetReaderTrackOutput
                    assetReaderTrackOutputWithTrack:track
                    outputSettings:@{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)}];
    AVAssetReader *reader = [AVAssetReader assetReaderWithAsset:asset
                                                          error:nil];
    [reader addOutput:readerTrack];
    [reader startReading];

    CMSampleBufferRef sample = NULL;

    while ((sample = [readerTrack copyNextSampleBuffer])) {
        CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sample);
        block(imageBuffer);
    }
}

ブロックは基本的に呼び出すだけです

    SInt32 status = VTCompressionSessionEncodeFrame(_compressionSession, imageBuffer, CMTimeMake(self.currentFrameNumber++, 30), kCMTimeInvalid, NULL, (__bridge void *)self, NULL);

ステータスは -12902 です。このサイトでステータスに関する情報を調べましたが、他に関連する情報は見つかりませんでした。サイトによると、エラーはkVTParameterErr.

VTCompressionOutputCallback が呼び出されていません。

このエラーコードを説明できる人はいますか?

4

1 に答える 1

0

_compressionSession が NULL だったことが判明したため、kVTParameterErr.

VTCompressionSessionEncodeFrame を中断すると、どのパラメーターが正しくないかを判断するのに役立ちます。ドキュメントには、どのパラメーターが NULL になる可能性があるかが示されています (セッションと画像バッファー以外のほとんどすべて)。

私の特定のケースでは、インスタンス メソッドではなくクラス メソッドで誤って VTCompressionSessionCreate を使用していたため、imageBuffer を送信していたインスタンスには独自の圧縮セッションがありませんでした。

于 2015-09-08T20:20:55.203 に答える