Golang 调用 dll 实现音频 播放、暂停、停止

背景

最近项目中需要使用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的开启Golang 调用 dll 实现音频 播放、暂停、停止_第1张图片

如果是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

你可能感兴趣的:(GO,golang,go,dll,webrtc)