Как использовать gobuffalo / packr с Golang - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь воспроизвести звук с Голанга. Это файл .wav. И я хочу упаковать файл .wav в исполняемый файл, используя packr

Я создал очень маленький проект здесь: packr-test репозиторий с кодом.

Когда я запускаю исполняемый файл (./packr-test) в его папке по умолчанию, воспроизводится звук. Но проблема у меня заключается в том, что когда я перемещаю исполняемый файл в другой каталог, я получаю сообщение об ошибке при попытке воспроизвести звуковой файл. Возможно, это означает, что звуковой файл не связан с исполняемым файлом.

Это на Ubuntu. Я использую команду 'play', которая часто устанавливается по умолчанию, но если ее там нет, это можно сделать с помощью:

sudo apt-get install sox
sudo apt-get install sox libsox-fmt-all

Чтобы использовать команду воспроизведения:

play file_name.extension

Чтобы вы не искали его, вот мой код Go:

package main

import (
    "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 Ответ

0 голосов
/ 15 января 2019

Вы по-прежнему ссылаетесь на файл в файловой системе, даже если он упакован в двоичный файл:

args := []string{"-v20", "./sounds/IEEE_float_mono_32kHz.wav"}
output, err := exec.Command("play", args...).Output()

Вы можете получить данные файла из вашей упаковочной коробки следующим образом:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...