2016-10-01 30 views
1

我无法使用Windows Universal的Naudio播放解码opus数据包。声音播放一秒钟,然后停止,例外。我收到的例外是InvalidOperation - Timed out waiting for eventNAudio Universal:超时等待事件

这里是我的代码:

public void ForStackOverFlow() 
{ 
    var waveOut = new WasapiOutRT(AudioClientShareMode.Shared, 200); 
    waveOut.PlaybackStopped += WaveOut_PlaybackStopped; 
    var opusDecoder = OpusDecoder.Create(48000, 1); 
    var ms = new MemoryStream(); 

    var voiceData1 = "3OxQRhb/datLhcmWgOhYPrYGwxyciCulHDwJl8RmJHkdWVcENoAYvgLtcFn0LBLbLJ2jHRPv8Wb/oZSsTp3oJbllORxffNIyZO1TCCf2L + dkN5AMKRmiIyYaJQrh5Bt4ucLfNskhwKwz/CfLV7RRTZrBJM + 0AqBXS9dt3 + yeBofItCGUm/GCT94pW5fl9U7Zez + RodOAzyEemdCS + Zfpquw0XctnM0L/b1llt3oHZOpot1BUY + tDyXmSNbcfxPjYmVvPT2y4aQ =="; 
    var sample = Convert.FromBase64String(voiceData1); 

    int frameSize = 1920; 

    short[] outputBuffer = new short[frameSize]; 
    var decodedLen = opusDecoder.Decode(sample, 0, sample.Length, outputBuffer, 0, frameSize, false); 

    short[] finalOutput = new short[frameSize]; 
    Array.Copy(outputBuffer, finalOutput, finalOutput.Length); 

    var audioBytes = AudioMath.ShortsToBytes(finalOutput, 0, finalOutput.Length); 

    System.Diagnostics.Debug.WriteLine("AUDIOBYTES:" + Convert.ToBase64String(audioBytes)); 

    ms.Write(audioBytes, 0, audioBytes.Length); 

    ms.Flush(); 
    ms.Seek(0, SeekOrigin.Begin); 
    IWaveProvider provider = new RawSourceWaveStream(ms, new WaveFormat(48000, 16, 1)); 
    waveOut.Init(provider); 
    waveOut.Play(); 
} 

private void WaveOut_PlaybackStopped(object sender, StoppedEventArgs e) 
{ 
    //event fires with exception. 
} 

任何帮助,将不胜感激。

+0

你用什么库'OpusDecoder'和'AudioMath'? –

回答

0

我说得对,在这里你得到结果的长度:如果是的话,你为什么不创建finalOutput数组变量,并使用framesize常数代替

var decodedLen = opusDecoder.Decode 

short[] finalOutput = new short[frameSize]; 

应该不是这一行是这样的:

short[] finalOutput = new short[decodedLen];