美文网首页
CMSampleBufferRef/CVImageBufferR

CMSampleBufferRef/CVImageBufferR

作者: 793ab439abb3 | 来源:发表于2018-12-28 23:30 被阅读0次

    因为需要在相机界面实时缩放,效率原因,不采取CMSampleBufferRef转cgimage在缩放。

    暂时找到的方法是通过vImage来缩放,代码如下,缩放成功返回得到的CVImageBuffer,转化为uiimage可以显示到imageView,却无法转化为CVMetalTextureRef(因为需要对缩放的CVImageBuffer进行滤镜操作)。
    其他方式 https://www.jianshu.com/p/ac79a80f1af2

    
        CVImageBufferRef imageBuffer =CMSampleBufferGetImageBuffer(sampleBuffer);
    
    
    
    vImage_Error ret;
    
        // Create dest buffer
    
        constNSUIntegerscale =1;
    
        constNSUIntegerdstWidth = (NSUInteger)fitSize.width* scale;
    
        constNSUIntegerdstHeight = (NSUInteger)fitSize.height* scale;
    
        constNSUIntegerbytesPerPixel =4;
    
        constNSUIntegerdstBytesPerRow = bytesPerPixel * dstWidth;
    
        uint8_t* dstData = (uint8_t*)calloc(dstHeight * dstWidth * bytesPerPixel,sizeof(uint8_t));
    
        vImage_BufferdstBuffer = {
    
            .data= dstData,
    
            .height= dstHeight,
    
            .width= dstWidth,
    
            .rowBytes= dstBytesPerRow,
    
        };
    
    
    
        // Scale
    
        ret =vImageScale_ARGB8888(&srcBuffer, &dstBuffer, NULL, kvImageHighQualityResampling);
    
    //    free(srcBuffer.data);
    
        if (ret != kvImageNoError)
    
        {
    
            free(dstData);
    
            returnnil;
    
        }
    
    
    
        CVPixelBufferRef pxbuffer =NULL;
    
        NSDictionary *options =@{(NSString *)kCVPixelBufferCGImageCompatibilityKey:@YES,(NSString *)kCVPixelBufferCGBitmapContextCompatibilityKey:@YES,(NSString *)kCVPixelBufferMetalCompatibilityKey:@YES};
    
        CVReturnstatus =CVPixelBufferCreateWithBytes(kCFAllocatorDefault, fitSize.width, fitSize.height,kCVPixelFormatType_32BGRA, dstData, dstBuffer.rowBytes,nil,nil, (__bridgeCFDictionaryRef)options, &pxbuffer);
    
        return pxbuffer;
    
    

    滤镜操作无法完成,代码如下

    
    CVMetalTextureRef thumbMetalTexture;
    
                CVReturnssstatus =  CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault,self.thumbTextureCache, thttt,NULL,MTLPixelFormatBGRA8Unorm,50,50,0, &thumbMetalTexture);
    
                if(ssstatus !=0) {
    
                    NSLog(@"%d",ssstatus);
    
                    return;
    
                }
    
    

    ssstatus = -6660,原因未知。

    相关文章

      网友评论

          本文标题:CMSampleBufferRef/CVImageBufferR

          本文链接:https://www.haomeiwen.com/subject/lbpylqtx.html