我在Go中开发了一个应用程序,用于将音频文件从一种格式转码为另一种格式:
我使用使用 Cgo 绑定 FFmpeg C 库的 goav 库:https://github.com/giorgisio/goav/
戈夫图书馆; 具有一个类型定义,该定义将原始 FFmpeg 库 C-结构 AV输出格式转换为:package avformat
type (
OutputFormat C.struct_AVOutputFormat
)
在我的代码中,我有一个名为 的变量,该变量的类型是.outputFOutputFormatC.struct_AVOutputFormat
真正的结构有以下字段:CAVOutputFormat
name, long_name, mime_type, extensions, audio_codec, video_codec, subtitle_codec,..
以及许多领域。
请参见: https://ffmpeg.org/doxygen/2.6/structAVOutputFormat.html
我通过以下方式验证了情况并到达:fmt.Println(outputF)
{0x7ffff7f23383 0x7ffff7f23907 0x7ffff7f13c33 0x7ffff7f23383 86017 61 0 128 <nil> 0x7ffff7f8cfa0 <nil> 3344 0x7ffff7e3ec10 0x7ffff7e3f410 0x7ffff7e3ecc0 <nil> 0x7ffff7e3dfc0 <nil> <nil> <nil> <nil> <nil> <nil> 0 0x7ffff7e3e070 0x7ffff7e3e020 <nil>}
音频编解码器字段位于位置,包含586017
我使用包验证了字段名称:reflect
val := reflect.Indirect(reflect.ValueOf(outputF))
fmt.Println(val)
fmt.Println("Fieldname: ", val.Type().Field(4).Name)
Output:
Fieldname: audio_codec
我尝试使用以下命令访问原始字段:audio_codecAVOutputFormat
fmt.Println(outputF.audio_codec)
ERROR: outputF.audio_codec undefined (cannot refer to unexported field or method audio_codec)
fmt.Println(outputF._audio_codec)
ERROR: outputF._audio_codec undefined (type *avformat.OutputFormat has no field or method _audio_codec)
正如我在Cgo文档中读到的:在Go文件中,可以通过在下划线前缀来访问作为Go中关键字的C结构字段名称:如果x指向带有名为“type”的字段的C结构,x._type访问该字段。无法在 Go 结构中表示的 C 结构字段(如位字段或未对齐的数据)在 Go 结构中被省略,替换为适当的填充以到达下一个字段或结构的末尾。
但我不知道我做错了什么。
编辑:好吧,肯定不需要下划线,因为audio_codec不是Go中的关键字。我现在明白了。但是仍然存在一个问题,为什么我无法访问CStruct字段“audio_codec”。
慕哥6287543
相关分类