Я пишу приложение для платформы Windows, используя FFmpeg и его goav-оболочку golang, но у меня возникают проблемы с пониманием того, как использовать указатели C для получения доступа к массиву.
Я пытаюсь получить потоки, хранящиеся в классе AVFormatContext, для использования в движении и, в конечном итоге, добавить кадры в текстуру в OpenGl, чтобы сделать видеоплеер с классными переходами.
Я думаю, что понимание того, как преобразовать и получить доступ к данным C, значительно упростит кодирование.
Я удалил все соответствующие части кода C, оболочки и моего кода, как показано ниже:
Код C - libavformat/avformat.h
typedef struct AVFormatContext {
unsigned int nb_streams;
AVStream **streams;
}
Обертка Golang Goav
package avutil
//#cgo pkg-config: libavformat
//#include <libavformat/avformat.h>
import "C"
import (
"unsafe"
)
type Context C.struct_AVFormatContext;
func (ctxt *Context) StreamsGet(i uintptr) *Stream {
streams := (**Stream)(unsafe.Pointer(ctxt.streams));
// I think this is where it's going wrong, I'm brand new to this stuff
return (*Stream)(unsafe.Pointer(uintptr(unsafe.Pointer(streams)) + i*unsafe.Sizeof(*streams)));
}
Мой код Голанга
package main
import "github.com/giorgisio/goav/avformat"
func main() {
ctx := &avformat.Context{} // the actual function to initiate this does an mallocz for the streams
stream := ctx.StreamsGet(0)
//do stuff with stream...
}
В C похоже, что мне просто нужно делать только streams[i], но это не сработает в go, поэтому я добавил функцию в оболочку, используя технику из моего вопроса здесь. Однако я не получаю данные; Похоже, я получаю указатель на случайное место в памяти. Итак, как я могу получить доступ к этим элементам из golang? Любые ресурсы тоже будут полезны; Я собираюсь инвестировать в это довольно много времени.