2012-02-29 15 views
2

私は、RTPペイロードとしてパッケージングするのに適したulawサンプルを得る方法を試してみるNAudioの例を見てきました。私は下のコードを使用してmp3ファイルからサンプルを生成しようとしています。驚くことではありませんが、NAudioで何をやっているのか分かりませんので、サンプルをネットワーク経由でソフトフォンに送信すると、静かです。NAudioを使用してRTPのUlawサンプルを取得

NAudioを使用してMP3ファイルから160バイト(8Khz @ 20ms)のULAWサンプルを取得する方法については、

private void GetAudioSamples() 
{ 
    var pcmStream = WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader("whitelight.mp3")); 
    byte[] buffer = new byte[2]; 
    byte[] sampleBuffer = new byte[160]; 
    int sampleIndex = 0; 
    int bytesRead = pcmStream.Read(buffer, 0, 2); 

    while (bytesRead > 0) 
    { 
     var ulawByte = MuLawEncoder.LinearToMuLawSample(BitConverter.ToInt16(buffer, 0)); 
     sampleBuffer[sampleIndex++] = ulawByte; 

     if (sampleIndex == 160) 
     { 
      m_rtpChannel.AddSample(sampleBuffer); 
      sampleBuffer = new byte[160]; 
      sampleIndex = 0; 
     } 

     bytesRead = pcmStream.Read(buffer, 0, 2); 
    } 

    logger.Debug("Finished adding audio samples."); 
} 

答えて

3

以下は、私が最終的にそれを動作させる方法です。 mp3からチャンネルの1つを失うので、チャンネルをコンバージョンの一部として組み合わせる方法があると思いますが、それは自分の状況には関係ありません。

バッファサイズが160バイトなので、テストしているSIPソフトフォンと完全に機能する20msのulawサンプルが得られます。

var pcmFormat = new WaveFormat(8000, 16, 1); 
var ulawFormat = WaveFormat.CreateMuLawFormat(8000, 1); 

using (WaveFormatConversionStream pcmStm = new WaveFormatConversionStream(pcmFormat, new Mp3FileReader("whitelight.mp3"))) 
{ 
    using (WaveFormatConversionStream ulawStm = new WaveFormatConversionStream(ulawFormat, pcmStm)) 
    { 
     byte[] buffer = new byte[160]; 
     int bytesRead = ulawStm.Read(buffer, 0, 160); 

     while (bytesRead > 0) 
     { 
      byte[] sample = new byte[bytesRead]; 
      Array.Copy(buffer, sample, bytesRead); 
      m_rtpChannel.AddSample(sample); 

      bytesRead = ulawStm.Read(buffer, 0, 160); 
     } 
    } 
} 
+0

こんにちは、あなたはCTPでRTPを使っていましたか? – gabssnake

+0

@gabssnake私は自分の原油RTP実装https://github.com/sipsorcery/sipsorcery/tree/master/sipsorcery-core/SIPSorcery.Net/RTPを使用しました。これは完全なRTP標準をサポートしていませんが、基本的なオーディオ伝送に十分対応しています。 – sipwiz

2

ここにいくつかの点があります。まず、NAudio 1.5を使用している限り、WaveFormatConversionStreamを追加する必要はありません.Mp3FileReaderのReadメソッドはPCMを返します。

しかし、8kHzを出力しないので、最初にリサンプリングする必要があります。 WaveFormatConversionStreamはこれを行うことができますが、組み込みのWindows ACMのサンプルレート変換を使用していますが、受信したオーディオをうまくフィルタリングしないように見えるため、エイリアシングアーチファクトが存在する可能性があります。

また、MP3デコーダはフレームを一度に1つずつデコードする必要があるため、通常は2バイトだけではなく、より大きなブロックを読み込みます(リサンプラもより大きなブロックサイズを処理したい)。私は一度に少なくとも20ms分のバイト分の読み込みを試みます。

BitConverter.ToInt16を使用すると、16ビットのサンプル値が得られますが、MP3は左と右のサンプルでステレオになる可能性があることに注意してください。お使いの携帯電話がステレオを期待していますか?

最後に、WaveFileWriterを使用して、最初の手順としてmu-law WAVファイルを作成することをおすすめします。その後、Windows Media Playerで簡単に聞くことができ、あなたのソフトフォンに送信しているものがあなたの意図したものであることを確認できます。

関連する問題