我正在使用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];
}
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?
}
答案 0 :(得分:1)
由于库作者没有构建切片标题供您使用,因此您需要将返回值转换为let
,然后转换为unsafe.Pointer
这将允许您对它执行指针运算,以便稍后在内存中获取元素。
这是一些应该在go操场上按原样运行的示例代码。
uintptr
当然,你需要非常肯定你知道有多少元素,这样你就不会访问无效的内存。