用goav 配置avoption时的一个bug github.com/giorgisio/goav/issues/57
code :
var dict *avutil.Dictionary = &avutil.Dictionary{} er := dict.AvDictSet("profile", "main", 0) if er < 0 { log.Critical("AvDictSet failed") return } er = dict.AvDictSet("level", "51", 0) if er < 0 { log.Critical("AvDictSet failed") return } fmt.Println(dict.AvDictCount()) fmt.Println(dict.AvDictGet("profile", nil, 0)) fmt.Println(dict.AvDictGet("level", nil, 0)) err = context_enc.AvcodecOpen2(codec_enc, (**avcodec.Dictionary)(unsafe.Pointer(&dict))) if err < 0 { log.Critical("AvcodecOpen2 failed.") return }double free or corruption (out) SIGABRT: abort PC=0x7f3a6082aed7 m=0 sigcode=18446744073709551610
goroutine 0 [idle]: runtime: unknown pc 0x7f3a6082aed7 stack: frame={sp:0x7fff8f1abb70, fp:0x0} stack=[0x7fff8e9ad228,0x7fff8f1ac250) 00007fff8f1aba70: 0000000000000000 000000000227fbc0 00007fff8f1aba80: 00000000ffffffff 00007fff8f1abae8 00007fff8f1aba90: 00007f3a60cc3030 00007f3a623509f0 00007fff8f1abaa0: 00007f3a60cc5c25 0000000000000017
根本原因应该是没有dict.h里面没有AVDictionary的定义,添加一个alloc函数可以解决这个问题。
然后这样分配dict空间:
var dict *avutil.Dictionary = avutil.AvDictAlloc() er := dict.AvDictSet("profile", "constrained_baseline", 0) if er < 0 { log.Critical("AvDictSet failed") return } er = dict.AvDictSet("level", "52", 0) if er < 0 { log.Critical("AvDictSet failed") return } fmt.Println(dict.AvDictCount()) //fmt.Println(dict.AvDictGet("profile", nil, 0)) //fmt.Println(dict.AvDictGet("level", nil, 0)) //dict.AvDictFree() err = context_enc.AvcodecOpen2(codec_enc, (**avcodec.Dictionary)(unsafe.Pointer(&dict))) if err < 0 { log.Critical("AvcodecOpen2 failed.") return } fmt.Println(dict.AvDictCount())