2013-03-05 8 views
5

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

私はWAVを使用して圧縮されていないデータを送信することを計画していましたが、WAVファイル形式ではファイルサイズがヘッダーにあらかじめ定義されている必要があります。 Goで簡単に作業できるこのストリーミングを実行するためのより優れたコンテナ形式がありますか?

適切なストリーミングサーバーを使用してオーディオをトランスコードする方法があることは知っていますが、これを自分で実装する場合は、かなり簡単な方法で地面から降りることができますか?これをもっと簡単にするGoライブラリでしょうか?

おかげ

EDIT

+1

オープンソース[libvorbis]のラッパーを書く(あるhttp://www.xiph.org/downloads /)ライブラリを使用してストリームをエンコードします。たぶん誰かが既にラッパーを作ってインターネットを検索しているかもしれません。 – thwd

+2

あなた自身で問題を解決した場合は、自分の質問に回答を追加し、それを受け入れられた回答としてマークしてください。そうすれば、同じ問題を抱えている他の人たちも簡単に解決策を見ることができます。 –

+0

いいえ私は今自分の答えを受け入れた – wxs

答えて

0

これは私がやったことですが、私のGoコードはraw PCMデータをmp3に変換するffmpegプロセスでパイプします。私は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) 
} 
2

下記の私の答えに概説されているようあなたはまだ、究極の品質のために、非圧縮WAVファイルを考えているなら、私はその後、私は次の2つの選択肢を持っていると思うのffmpegを経由して、これを解決してきました

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

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

追加のチャンクを追加することは、the RIFF specのうち、WAV files are a subsetでサポートされているようです。その後、短い複数のチャンクのサウンドデータをWAVファイルに書き込むことができます。これはWAVプレーヤーによってサポートされるはずですが、WAVファイルがあまりよく標準化されていないことや、RIFFにあまり適合しないplayers just look for a 44 byte headerがたくさんあります。

私があなただったら、まず最初のオプションを試して、それがどう機能するかを見てみましょう。

+0

ちょうどうそはちょっと間違っているようだ。チャンクの追加テクニックを試してみるのは面白いですが、現時点ではカードではできません。 – wxs

関連する問題