1 回答
TA贡献1831条经验 获得超10个赞
GO / CGO有一些特质,你在这里碰到:
type OutputFormat C.struct_AVOutputFormat
是 go 类型声明,而不是别名。将其视为薄包装而不是别名可能会有所帮助。因此,C.struct_AVOutputFormat字段不会导出,这就是您获得OutputFormat != C.struct_AVOutputFormat
ERROR: outputF.audio_codec undefined (cannot refer to unexported field or method audio_codec)
如果该字段被调用Audio_codec它将符合go对导出标识符的定义,我们可以访问它,但事实并非如此。
有一种方法可以解决这个问题,但我建议在继续之前三思而后行,因为它使用不安全的指针,并且您的程序可能会在运行时失去可移植性和/或稳定性。如果您想了解更多信息,这是不安全指针的良好介绍。
现在,如果您确实确定要执行此操作,解决方案是将指针转换为不安全的指针,然后将其转换为指向 的指针。请注意,这需要您加载 FFMPEG 标头才能获得OutputFormat
C.struct_AVOutputFormat
C.struct_AVOutputFormat
//#cgo pkg-config: libavformat
//#include <libavformat/avformat.h>
import "C"
import (
"fmt"
"unsafe"
"github.com/giorgisio/goav/avformat"
)
func getOutput() *avformat.OutputFormat {
// calls out to avformat and gets an OutputFormat back
}
func main() {
outputF := getOutput()
coutput := *(*C.struct_AVOutputFormat)(unsafe.Pointer(outputF))
fmt.Println(coutput.audio_codec) // This should now work
}
警告:我还没有测试cgo包配置和导入是否正确,但这适用于一个简单的C库,我站起来尝试一下。<libavformat/avformat.h>
- 1 回答
- 0 关注
- 81 浏览
添加回答
举报