AVPicture中data与linesize关系

AVPicture结构中data和linesize关系

AVPicture里面有data[4]和linesize[4]其中data是一个指向指针的指针(二级、二维指针),也就是指向视频数据缓冲区的首地址,而data[0]~data[3]是一级指针,可以用如下的图来表示:

data -->xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
            ^                         ^                       ^
            |                           |                        |
        data[0]                data[1]              data[2]

比如说,当pix_fmt=PIX_FMT_YUV420P时,data中的数据是按照YUV的格式存储的,也就是:

data -->YYYYYYYYYYYYYYYYYYYYYYYYUUUUUUUUUUUVVVVVVVVVVVV
            ^                                        ^                      ^
            |                                          |                       |
       data[0]                                data[1]             data[2]

 

linesize是指对应于每一行的大小,为什么需要这个变量,是因为在YUV格式和RGB格式时,每行的大小不一定等于图像的宽度。

       linesize = width + padding size(16+16) for YUV
       linesize = width*pixel_size  for RGB
padding is needed during Motion Estimation and Motion Compensation for Optimizing MV serach and  P/B frame reconstruction

 

for RGB only one channel is available
so RGB24 : data[0] = packet rgbrgbrgbrgb......
           linesize[0] = width*3
data[1],data[2],data[3],linesize[1],linesize[2],linesize[2] have no any means for RGB

 

测试如下:(原始的320×182视频)
如果pix_fmt=PIX_FMT_RGBA32
linesize 的只分别为:1280  0    0     0

如果pix_fmt=PIX_FMT_RGB24
linesize 的只分别为:960   0    0     0

如果pix_fmt=PIX_FMT_YUV420P
linesize 的只分别为:352   176  176   0

 

参考:http://bbs.chinavideo.org/viewthread.php?tid=119&extra=page%3D1%26filter%3Ddigest&page=1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MFC ,可以使用以下代码将 YUY2 格式的字节流转换为图片: ```c++ // 初始化 FFmpeg av_register_all(); // 创建 AVFrame 和 AVPicture AVFrame *pFrame = av_frame_alloc(); AVPicture picture; avpicture_alloc(&picture, AV_PIX_FMT_YUV422P, [width], [height]); // 填充输入数据 uint8_t *inputData = [YUY2字节流数据]; int inputSize = [数据大小]; // 填充 AVFrame pFrame->data[0] = inputData; pFrame->data[1] = pFrame->data[0] + [width] * [height] * 2 / 4; pFrame->data[2] = pFrame->data[1]; pFrame->linesize[0] = [width] * 2; pFrame->linesize[1] = [width]; pFrame->linesize[2] = [width]; // 将 AVFrame 转换为 AVPicture struct SwsContext *sws_ctx = sws_getContext([width], [height], AV_PIX_FMT_YUYV422, [width], [height], AV_PIX_FMT_YUV422P, 0, NULL, NULL, NULL); sws_scale(sws_ctx, pFrame->data, pFrame->linesize, 0, [height], picture.data, picture.linesize); // 保存为图片 AVCodec *pCodec = avcodec_find_encoder(AV_CODEC_ID_MJPEG); AVCodecContext *pCodecCtx = avcodec_alloc_context3(pCodec); pCodecCtx->pix_fmt = AV_PIX_FMT_YUVJ422P; pCodecCtx->width = [width]; pCodecCtx->height = [height]; pCodecCtx->time_base.num = 1; pCodecCtx->time_base.den = 25; avcodec_open2(pCodecCtx, pCodec, NULL); AVPacket pkt; av_init_packet(&pkt); pkt.data = NULL; pkt.size = 0; int got_packet = 0; avcodec_encode_video2(pCodecCtx, &pkt, &picture, &got_packet); if (got_packet) { FILE *fp = fopen("[输出文件名].jpg", "wb"); fwrite(pkt.data, 1, pkt.size, fp); fclose(fp); } avcodec_close(pCodecCtx); av_free(pCodecCtx); av_free_packet(&pkt); // 释放资源 avpicture_free(&picture); av_frame_free(&pFrame); sws_freeContext(sws_ctx); ``` 其,`[width]` 和 `[height]` 分别是视频帧的宽度和高度,`[YUY2字节流数据]` 和 `[数据大小]` 分别是输入的 YUY2 格式的字节流数据和数据大小,`[输出文件名]` 是输出的图片文件名。 这段代码的实现过程是将 YUY2 格式的字节流转换为 AVFrame,再将 AVFrame 转换为 AVPicture,最后将 AVPicture 保存为 JPEG 格式的图片。需要注意的是,这里使用了 FFmpeg 的 libswscale 库进行图像转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值