CGO:如何在Golang中使用指针访问C

时间:2018-04-19 22:19:47

标签: c go ffmpeg cgo

我正在使用FFmpeg和它的golang包装goav为Windows平台编写应用程序,但我无法理解如何使用C指针访问数据阵列指向。

我试图将数据存储在AVFrame类中,并使用Go将其写入文件,最后使用OpenGl中的纹理使视频播放器具有很酷的过渡效果。

我认为理解如何投射和访问C数据将使编码变得更加容易。

我已经删除了C代码的所有相关部分,包装器和我的代码,如下所示:

C代码 - libavutil / frame.h

#include <stdint.h>

typedef struct AVFrame {
#define AV_NUM_DATA_POINTERS 8
    uint8_t *data[AV_NUM_DATA_POINTERS];
}
golang goav wrapper - 我真的不知道这里发生了什么不安全的事情和投射,但它让我可以访问底层的C代码

package avutil

/*
    #cgo pkg-config: libavutil
    #include <libavutil/frame.h>
    #include <stdlib.h>
*/
import "C"
import (
    "unsafe"
)

type Frame C.struct_AVFrame

func AvFrameAlloc() *Frame {
    return (*Frame)(unsafe.Pointer(C.av_frame_alloc()))
}

func Data(f *Frame) *uint8 {
    return (*uint8)(unsafe.Pointer((*C.uint8_t)(unsafe.Pointer(&f.data))))
}

我的Golang代码

package main

import "github.com/giorgisio/goav/avutil"

func main() {
    videoFrame := avutil.AvFrameAlloc()

    data := avutil.Data(videoFrame)

    fmt.Println(data) // here i want the values from data[0] to data[7], but how?
}

1 个答案:

答案 0 :(得分:1)

由于库作者没有构建切片标题供您使用,因此您需要将返回值转换为let,然后转换为unsafe.Pointer这将允许您对它执行指针运算,以便稍后在内存中获取元素。

这是一些应该在go操场上按原样运行的示例代码。

uintptr

当然,你需要非常肯定你知道有多少元素,这样你就不会访问无效的内存。