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
相关产品推荐
相关产品推荐

