2023-02-18:ffmpeg是c编写的音视频编解码库,请问用go语言如何调用?例子是03输出版本号。

2023-02-18:ffmpeg是c编写的音视频编解码库,请问用go语言如何调用?例子是03输出版本号。

答案2023-02-18:

用 github.com/moonfdd/ffmpeg-go 这个库。
这是我自己写的golang绑定ffmpeg库,只依赖动态链接库,不依赖头文件,接口全部是按照头文件改过来的。

这个库目前只能用在windows上,原因是go的回调函数在c中调用,用syscall.NewCallBack函数转换成uintptr,而这个函数只支持windows操作系统。请各位高手提供下跨平台的callback转换函数,拜托了。

代码参考ffmpeg5入门教程的第三个例子输出版本号,用golang改写的。

用如下命令便可查看运行结果。

go run ./examples/a03get_lib_version/main.go

代码用golang编写。代码如下:

package main

import (
    "fmt"
    "os"
    "os/exec"

    "github.com/moonfdd/ffmpeg-go/ffcommon"
    "github.com/moonfdd/ffmpeg-go/libavcodec"
    "github.com/moonfdd/ffmpeg-go/libavutil"
)

func main() {
    os.Setenv("Path", os.Getenv("Path")+";./lib")
    ffcommon.SetAvutilPath("./lib/avutil-56.dll")
    ffcommon.SetAvcodecPath("./lib/avcodec-58.dll")
    codecVer := libavcodec.AvcodecVersion()
    ver_major := (codecVer >> 16) & 0xff
    ver_minor := (codecVer >> 8) & 0xff
    ver_micro := (codecVer) & 0xff
    fmt.Printf("FFmpeg version is: %s .\navcodec version is: %d=%d.%d.%d.\n", libavutil.FFMPEG_VERSION, codecVer, ver_major, ver_minor, ver_micro)

    fmt.Println("---------------------------------")
    data, err := exec.Command("./lib/ffmpeg", "-version").Output()
    if err != nil {
        fmt.Println("ffmpeg err = ", err)
    }
    fmt.Println(string(data))
}

在这里插入图片描述

本作品采用《CC 协议》,转载必须注明作者和本文链接
微信公众号:福大大架构师每日一题。最新面试题,涉及golang,rust,mysql,redis,云原生,算法,分布式,网络,操作系统。
讨论数量: 4

直接把ffmpeg 作为依赖使用就行了,cmd 去执行 不能满足你吗

1年前 评论
moonfdd (楼主) 1年前

导出go的函数,使用CGO调用go的代码,使用C.callback将函数转换成函数指针

1年前 评论
package main

/*
static void invoke(void (*f)()) {
    f();
}

void go_print_hello();  // https://golang.org/issue/19837

typedef void (*closure)();  // https://golang.org/issue/19835
*/
import "C"

import "fmt"

//export go_print_hello
func go_print_hello() {
    fmt.Println("Hello, !")
}

func main() {
    C.invoke(C.closure(C.go_print_hello))
}
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
470
粉丝
21
喜欢
37
收藏
22
排名:457
访问:1.9 万
私信
所有博文
社区赞助商