You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg.AutoGen调用av_image_copy_to_buffer参数类型转换问题

问题描述

尝试使用 FFmpeg.AutoGen.av_image_copy_to_buffer 接口,将解码得到的图像数据写入应用自定义的frame_buffer缓冲区,初始调用代码如下:

bytes_decoded = ffmpeg.av_image_copy_to_buffer(frame_data, buffer_size, frame->data, frame->linesize, 
                                               codCtx->pix_fmt, codCtx->width, codCtx->height, 1);

编译阶段Visual Studio抛出CS1503编译错误:参数 frame->data 类型为 FFmpeg.AutoGen.byte_ptrArray8,与接口要求的 FFmpeg.AutoGen.byte_ptrArray4 类型不匹配,无法完成隐式转换。

解决方法

两个类型本质都是FFmpeg.AutoGen封装的非托管指针定长数组值类型,仅数组长度有区别:byte_ptrArray4长度为4,byte_ptrArray8长度为8。所有常规像素格式最多只会用到前4个数据平面,不会访问数组第5位及之后的元素,因此只需要提取frame->data前4位的有效指针即可完成参数传递,有两种可行实现:

  • 手动构造目标类型实例(推荐,无内存操作风险)
    直接新建byte_ptrArray4结构,依次赋值前4个平面的指针即可,不需要开启unsafe上下文:
    var planeData = new FFmpeg.AutoGen.byte_ptrArray4();
    planeData[0] = frame->data[0];
    planeData[1] = frame->data[1];
    planeData[2] = frame->data[2];
    planeData[3] = frame->data[3];
    
    // 替换原frame->data参数传入
    bytes_decoded = ffmpeg.av_image_copy_to_buffer(frame_data, buffer_size, planeData, frame->linesize, 
                                                   codCtx->pix_fmt, codCtx->width, codCtx->height, 1);
    
  • 内存拷贝实现(代码更简洁)
    两个类型均为连续内存布局的值类型,可以直接通过内存拷贝完成转换:
    FFmpeg.AutoGen.byte_ptrArray4 planeData;
    unsafe
    {
        Buffer.MemoryCopy(&frame->data, &planeData, (uint)sizeof(FFmpeg.AutoGen.byte_ptrArray4), (uint)sizeof(FFmpeg.AutoGen.byte_ptrArray4));
    }
    

注意:不可直接对两个结构体做强制类型转换,C#不支持不同值类型结构体的直接强转,会直接触发编译错误。

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:33:29