Потоковое аудио с Youtube с помощью GO

#go #audio-streaming #youtube-dl

#Вперед #потоковое аудио #youtube-dl

Вопрос:

Я пытаюсь использовать youtube-dl, чтобы получить URL-адрес аудио видео на YouTube, отправить запрос GET на этот URL-адрес, а затем использовать тело запроса io.ReadCloser и передать его https://github.com/faiface/beep декодер.

Поэтому, когда я делаю это с разными кодировками, я получаю следующую ошибку:

mp3: MPEG version 2.5 is not supported или mp3: only layer3 (want 1; got 2) is supported

wav: missing RIFF at the beginning >

flac: flac.parseStreamInfo: invalid FLAC signature; expected "fLaC", got "x00x00x00x18"

как вы можете видеть, мои знания о кодировании звука практически отсутствуют. Поскольку эти ошибки мне мало что говорят.

Но из того, что я понял, это то, что, вероятно, mp3 является желаемым форматом. И что MPEG 2.5 — это какой-то проприетарный формат? И то, что я, вероятно, хочу, это версия MPEG 2 или 1? Возможно ли это с помощью youtube-dl?

Также есть ли какой-либо другой способ сделать это вместо этого (потоковое аудио с YouTube с помощью GO?)

 package main

import (
    "log"
    "net/http"
    "time"
    "fmt"
    "os/exec"
    "strings"

    "github.com/faiface/beep"
    "github.com/faiface/beep/mp3"
    "github.com/faiface/beep/speaker"
)

func main() {
    audioUrl, err := GetAudioLink(
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        "mp3",
        "140",
    )
    if err != nil {
        log.Fatal(err)
    }

    req, err := http.Get(audioUrl)
    if err != nil {
        log.Fatal(err)
    }
    f := req.Body

    streamer, format, err := mp3.Decode(f)
    if err != nil {
        log.Fatal(err)
    }

    speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/60))
    done := make(chan bool)
    speaker.Play(beep.Seq(streamer, beep.Callback(func() {
        done <- true
    })))

    <-done
}

func GetAudioLink(url, format, youtubedlQuality string) (audioUrl string, err error) {
    var cmd []byte
    if cmd, err = exec.Command(
        "youtube-dl",
        "--extract-audio",
        "--get-url",
        "--audio-format",
        format,
        "-f",
        youtubedlQuality,
        url,
    ).Output(); err != nil {
        return audioUrl, fmt.Errorf("calling youtube-dl: %w", err)
    }
    audioUrl = strings.TrimSpace(string(cmd))
    return audioUrl, err
}
 

Убедитесь, что вы используете главную ветку https://github.com/faiface/beep go get github.com/faiface/beep@master

И вам нужна локальная установка youtube-dl. Я не смог найти для этого никакой библиотеки GO.