LiteAVSDK / Player_iOS

Super player for iOS...
https://trtc.io/
1.11k stars 226 forks source link

在onPlayerPixelBuffer回调的数据转换后,视频不完整 #236

Closed martenorton closed 2 years ago

martenorton commented 3 years ago

转换出来的图片不完整: image

操作代码:

+(cv::Mat) matFromImageBuffer: (CVImageBufferRef) buffer {
    cv::Mat mat;
    CVPixelBufferLockBaseAddress(buffer, 0);

    size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(buffer, 0);
    void *address = CVPixelBufferGetBaseAddress(buffer);
    int width = (int)CVPixelBufferGetWidth(buffer);
    int height = (int)CVPixelBufferGetHeight(buffer);

    mat = cv::Mat(height * 1.5, width, CV_8UC1, address, bytesPerRow);
    cv::Mat mat_dst;
    cv::cvtColor(mat, mat_dst, CV_YUV2RGBA_NV12); //ok
    CVPixelBufferUnlockBaseAddress(buffer, 0);

    return mat_dst;
}

UIImage *resultImg = MatToUIImage(resultMat);
return resultImg;
Tencent-Alice commented 3 years ago

您好,根据您的描述,是ios端吗,提供下具体操作步骤和播放器sdk版本号 技术问题 欢迎交流 q2562367495 注明来意

martenorton commented 3 years ago

image

试了另外一个代码,一样的问题:

+ (UIImage *)imageFromYUVImageBuffer:(CVImageBufferRef)imageBuffer {
    CVPixelBufferLockBaseAddress(imageBuffer, 0);
    size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0);
    size_t width = CVPixelBufferGetWidthOfPlane(imageBuffer, 0);
    size_t height = CVPixelBufferGetHeightOfPlane(imageBuffer, 0);
    void *lumaAddress = CVPixelBufferGetBaseAddress(imageBuffer);

    CGColorSpaceRef rgbSpace = CGColorSpaceCreateDeviceGray();
    CGContextRef context = CGBitmapContextCreate(lumaAddress, width, height, 8, bytesPerRow, rgbSpace, kCGRenderingIntentDefault );
    CGImageRef imageRef = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
    UIImage *image = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    return image;
}
Tencent-Alice commented 3 years ago

您好,如还是复现,请提供播放器sdk版本号,我们具体看下 技术问题 欢迎交流 q2562367495 注明来意

martenorton commented 3 years ago

情况还是出现,sdk版本号:8.4

martenorton commented 3 years ago

解决了,原来是格式错误,这样转就可以正常显示了:

+ (UIImage*)uiImageFromPixelBuffer:(CVPixelBufferRef)p {
    CIImage* ciImage = [CIImage imageWithCVPixelBuffer:p];

    CIContext* context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(YES)}];

    CGRect rect = CGRectMake(0, 0, CVPixelBufferGetWidth(p), CVPixelBufferGetHeight(p));
    CGImageRef videoImage = [context createCGImage:ciImage fromRect:rect];

    UIImage* image = [UIImage imageWithCGImage:videoImage];
    CGImageRelease(videoImage);

    return image;
}