美文网首页
iOS 使用libyuv实现AVFrame->I420P帧结构转

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

作者: 找不到工作的iOS | 来源:发表于2019-12-24 10:45 被阅读0次

    项目内导入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
    

    相关文章

      网友评论

          本文标题:iOS 使用libyuv实现AVFrame->I420P帧结构转

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