7

ライブの非圧縮オーディオをブラウザーにストリーミングしたい Go アプリケーションがあります。ブラウザーでストリームに対応する URL を開き、その接続にオーディオ データを供給するだけで、HTTP 経由でストリーミングすることを望んでいました。

データを非圧縮で送信するために WAV を使用する予定でしたが、WAV ファイル形式では、ファイル サイズをヘッダーで事前定義する必要があります。Go で簡単に操作できる、このストリーミングを行うためのより良いコンテナー形式はありますか?

1 つのアプローチとして、適切なストリーミング サーバーを使用し、それを介して音声をトランスコードすることはわかっていますが、これを自分で実装する場合、かなり簡単に開始する方法はありますか? おそらく、これを簡単にする Go ライブラリでしょうか?

ありがとう

EDIT以下の回答で概説するように、ffmpegを介してこれを解決しました

4

2 に答える 2

2

究極の品質のために非圧縮 WAV についてまだ考えている場合は、2 つの選択肢があると思います。

  1. ヘッダーにある - WAV が非常に長いと言う (2GB と言う)
  2. 追加のチャンクを RIFF コンテナーに追加する

最初の選択肢は実装が簡単ですが、ナイーブなブラウザーが 2GB のファイルをストリーミングする代わりにダウンロードしようとすることを意味します。HTML5 を実装するものがそれほど単純ではないことを願っていますが、試してみる必要があると思います。

2 番目の選択肢であるチャンクの追加は、WAV ファイルがサブセットであるRIFF 仕様でサポートされているようです。次に、サウンド データの複数の短いチャンクを含む WAV ファイルを作成できます。これは WAV プレーヤーでサポートされているはずですが、WAV ファイルは特に十分に標準化されていないため、サポートされていない可能性があります。多くのプレーヤーは、 RIFF にあまり準拠していない44 バイトのヘッダーを探しているだけです!

私があなたなら、最初のオプションを最初に試して、それがどのように機能するかを確認します.

于 2013-03-06T09:02:29.473 に答える
0

OK、これが私がやったことです。私のGoコードは、mp3に変換するffmpegプロセスを介して生のPCMデータをパイプします。packetsは、オーディオ データが表示されているチャネルでresponseあり、http.ResponseWriterであると想定しています。

cmd := exec.Command("ffmpeg", "-v", "verbose", "-f", "u16le", "-ar", "44100", "-ac", "1", "-i", "-", "-f", "mp3", "-")
audioIn, err := cmd.StdinPipe()
if err != nil {
    log.Println("Failed to create stdin pipe")
}
audioOut, err := cmd.StdoutPipe()
if err != nil {
    log.Println("Failed to create stdout pipe")
}
err = cmd.Start()
if err != nil {
    log.Println("Failed to start ffmpeg command, error: ", err)
}
go func() {
    for {
        packet := <-packets
        audioIn.Write(packet.Payload)
    }
}
go func() {
    amount, err := io.Copy(response, audioOut)
    if err != nil {
        log.Println("io copy terminated with an error", err)
    }
    log.Printf("Done copying audio data: %d bytes\n", amount)
}()
err = cmd.Wait()
if err != nil {
    log.Println("ffmpeg command terminated incorrectly", err)
}
于 2013-03-07T23:00:32.970 に答える