iOS 使用libyuv实现AVFrame->I420P帧结构转

2019-12-24  本文已影响0人  找不到工作的iOS

项目内导入libyuv与FFMpge

#import <Foundation/Foundation.h>
#import "libyuv.h"
#import "avformat.h"

NS_ASSUME_NONNULL_BEGIN

@interface CPCameraVideoFrame : NSObject

@property (nonatomic, assign)uint8 *desFrame; // I420
@property (nonatomic, assign)int dataSize;
@property (nonatomic, assign)int width;
@property (nonatomic, assign)int height;

- (instancetype)initWithAVFrame:(AVFrame *)avframe;

- (uint8 *)avframeToI420:(AVFrame *)avframe;

@end

#import "CPCameraVideoFrame.h"

@implementation CPCameraVideoFrame

- (instancetype)initWithAVFrame:(AVFrame *)avframe {
    if (self = [super init]) {
        _width = avframe->width;
        _height = avframe->height;
        _dataSize = avframe->width * avframe->height * 3 / 2;
        _desFrame = [self avframeToI420:avframe];
    }
    return self;
}

- (uint8 *)avframeToI420:(AVFrame *)avframe {
    int width = avframe->width;
    int height = avframe->height;
    int dataSize = (width * height) * 3 / 2;

    int uoffset = width * height;
    int voffset = uoffset + (uoffset >> 2); // uoffset / 4

    uint8 *desbuffer = (uint8 *)malloc(dataSize);

    I420Copy(avframe->data[0],
    avframe->linesize[0],
    avframe->data[1], avframe->linesize[1],
    avframe->data[2], avframe->linesize[2],
    desbuffer, width,
    desbuffer + uoffset, width >> 1,
    desbuffer + voffset, width >> 1,
    width, height);

    return desbuffer;
}

@end
上一篇下一篇

猜你喜欢

热点阅读