Я пишу приложение для платформы Windows, используя FFmpeg и его goav-оболочку golang, но у меня возникли проблемы с пониманием того, как использовать указатели 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];
}
Goav-оболочка Golang - я действительно не знаю, что здесь происходит с unsafe.Pointers и кастингом, но это дает мне доступ к базовому коду 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))))
}
Мой код Голанга
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?
}