为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Golang 中使用 gobuffalo/packr

如何在 Golang 中使用 gobuffalo/packr

Go
潇湘沐 2023-06-01 15:11:36
我正在尝试播放来自 Golang 的声音。这是一个 .wav 文件。我想使用packr将 .wav 文件打包成可执行文件我在这里创建了一个非常小的项目:带有代码的packr-test 存储库。当我在默认文件夹中运行可执行文件 (./packr-test) 时,会播放声音。但我遇到的问题是,当我将可执行文件移动到另一个目录时,我在尝试播放声音文件时遇到错误。我认为这可能意味着声音文件没有与可执行文件捆绑在一起。这是在 Ubuntu 上。我正在使用通常默认安装的“播放”命令,但如果它不存在,可以通过以下方式完成:sudo apt-get install soxsudo apt-get install sox libsox-fmt-all使用播放命令:play file_name.extension为了节省您的查找时间,这是我的 Go 代码:package mainimport (    "fmt"    "os/exec"    "github.com/gobuffalo/packr")func main() {    soundsBox := packr.NewBox("./sounds")    if soundsBox.Has("IEEE_float_mono_32kHz.wav") {        fmt.Println("It's there.")    } else {        fmt.Println("It's not there.")    }    args := []string{"-v20", "./sounds/IEEE_float_mono_32kHz.wav"}    output, err := exec.Command("play", args...).Output()    if err != nil {        // Play command was not successful        fmt.Println("Got an error.")        fmt.Println(err.Error())    } else {        fmt.Println(string(output))    }}这是我的输出:sudo ./packr-test It's there.Got an error.exit status 2
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

您仍在引用文件系统上的文件,即使您已将其打包到二进制文件中:


args := []string{"-v20", "./sounds/IEEE_float_mono_32kHz.wav"}

output, err := exec.Command("play", args...).Output()

您可以像这样从 packr 框中获取文件数据:


bytes, err := soundsBox.FindBytes("IEEE_float_mono_32kHz.wav")

要执行文件,exec.Command()我认为你必须将这些字节写回文件系统:


err := ioutil.WriteFile("/tmp/IEEE_float_mono_32kHz.wav", bytes, 0755)

exec.Command("play", []string{"-v20", "/tmp/IEEE_float_mono_32kHz.wav"}

您也许可以play通过标准输入将字节传递给它,但这取决于play二进制文件的工作方式。


cmd.Stdin = bytes

cmd.Run()


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信