背景
最近项目中需要使用GO去 播放、暂停音频…一开始是使用go的mp3模块,但是在暂停、停止上 以及解码的速度上在测试过程中存在一些问题,固使用了go 调用winapi 去操作音频,奈何winmm.dll 在调用上总是有那么一些问题…所以自己编译了一个dll快速的能播放 暂停音频.
go 代码
import (
"fmt"
"runtime"
"syscall"
"time"
"unsafe"
)
const HELLODLLPATH = "shushu.dll"
var (
MediaDll = syscall.NewLazyDLL(HELLODLLPATH)
startPlay = MediaDll.NewProc("startPlay") // 开始播放mp3
//stopPlay = MediaDll.NewProc("stopPlay") // 停止播放mp3
continuePlay = MediaDll.NewProc("continuePlay") //继续播放mp3
suspendPlay = MediaDll.NewProc("suspendPlay") // 暂停播放mp3
)
func main() {
go (func() {
_, _, _ = startPlay.Call(strPtr("E:\\gowww\\src\\playmedia\\123.mp3"))
})();
go (func() {
time.Sleep(time.Second * 10) // 正常
fmt.Println("第二个定时任务开始")
//_, _, _ = startPlay.Call(strPtr("E:\\gowww\\src\\playmedia\\26、水龙头.mp3"))
_, _, _ = suspendPlay.Call()
fmt.Println("开始结束2")
})();
go (func() {
time.Sleep(time.Second * 15) // 正常
fmt.Println("第二个定时任务开始")
//_, _, _ = startPlay.Call(strPtr("E:\\gowww\\src\\playmedia\\26、水龙头.mp3"))
_, _, _ = continuePlay.Call()
fmt.Println("开始结束2")
})();
for {
// 获取当前运行的goruntime 数量
fmt.Println(runtime.NumGoroutine())
time.Sleep(1 * time.Second)
}
}
func strPtr(s string) uintptr {
news, _ := syscall.BytePtrFromString(s)
return uintptr(unsafe.Pointer(news))
}
注意
golang 调用自定义dll时 需修改系统为386 和CGO的开启
如果是windows 编译
GOARCH=386;CGO_ENABLED=1
SET CGO_ENABLED=1 SET GOARCH=386
go build main.go
Dll 下载地址
链接:https://pan.baidu.com/s/17i4jQ2kZ2ASubIyvXw8QMA
提取码:karn