9

ブラウザーからオーディオ入力を取得し、それを複数のリスナーにストリーミングしようとしています。用途は音楽用ですので、音質はmp3規格程度でお願いします。

私は2つの方法を試みましたが、どちらも失敗した結果をもたらしました:

WebRTC

  • ブラウザ間でオーディオを直接ストリーミングすることは問題なく機能しますが、私が見たところ、オーディオ品質はカスタマイズできないようです。(Opus オーディオ コーデックを使用していることがわかりましたが、コントロールを公開していないようです)。
  • WebRTC ストリームのオーディオ品質を向上させる方法について洞察を持っている人はいますか?

ウェブソケット

  • 問題は、ブラウザからサーバーへの転送です。以下の方法で取得できる PCM オーディオ データは、websocket 経由でサーバーに繰り返しストリーミングするには大きすぎることがわかっています。ストリームは高速インターネット環境では完全に機能しますが、低速の wifi では使用できません。

    var context = new webkitAudioContext()
    navigator.webkitGetUserMedia({audio:true}, gotStream)
    
    function gotStream (stream)
    {
        var source = context.createMediaStreamSource(stream)
        var proc = context.createScriptProcessor(2048, 2, 2)
    
        source.connect(proc)
        proc.connect(context.destination)
        proc.onaudioprocess = function(event)
        {
            var audio_data = event.inputBuffer.getChannelData(0)|| new Float32Array(2048)
            console.log(audio_data)
            // send audio_data to server
        }
    }
    

そこで主な質問は、サーバーへのストリーミングを容易にするために PCM データを圧縮する方法はないかということです。それとも、これについてもっと簡単な方法がありますか?

4

3 に答える 3

4

PCM データを圧縮する方法はたくさんありますが、現実的には、WebRTC を適切に機能させることが最善の策です。WebRTC はこれを行うように設計されています - 適応的にメディアをストリーミングします - ただし、「複数の」リスナーの意味を定義していません (3 つのリスナーと 300,000 の同時リスナーの間には大きな違いがあります)。

于 2013-12-23T20:25:07.133 に答える
2

データをリサンプリングおよび/または圧縮する方法はいくつかありますが、どれもネイティブではありません。speex.js環境の xaudio.js lib を使用して、データを 8Khz Mono (マイレージは異なる場合があります) にリサンプリングしました。speex を使用してストリームを圧縮することもできますが、通常は音声のみに使用されます。あなたの場合、おそらくストリームをサーバーに送信し、そこで圧縮して視聴者にストリーミングします。単純なブラウザーが、膨大な数のユーザーにデータを提供するのに十分であるとは本当に思えません。

于 2013-12-26T11:36:09.970 に答える