【问题标题】:play audio byte stream coming from android device using NAudio使用 NAudio 播放来自 android 设备的音频字节流
【发布时间】:2013-06-05 03:55:30
【问题描述】:

出于测试目的,我实现了 c# 代码只是为了播放缓冲区的一个片段(通过在 while 循环中执行,我可以读取来自套接字的整个数据并播放) 我使用了这三个版本的 nAudio(v1.2、v1.3、v1.7)这三个版本在这种情况下给出了不同的错误,我在下面列出了它们(我也很困惑为什么会这样)。 我已经附上了我的源代码。

使用 NAudio 1.3 时

  • FormatException 未处理。
  • 说明 - 不是一个可识别的 MP3 块
  • 错误行:- 使用(WaveStream blockAlignedStream = 新的 BlockAlignReductionStream( WaveFormatConversionStream.CreatePcmStream( 新的 Mp3FileReader(ms))))

使用 NAudio 1.6 时

  • InvaliedOperationException 未处理
  • 说明 - 在采样率为 48000 的 mp3 中获得了采样率为 16000 的帧。Mp3FileReader 不支持采样率更改。
  • 错误行-同一行

使用 NAudio 1.7 时

  • NullReferenceException 未处理
  • 说明 - 对象引用未设置为对象的实例。
  • 错误行 - 同一行

我使用 1.7 而不是 1.6,因为它支持采样率更改(在来源中提到)。然后我得到上述错误。 每次我得到同一行错误行。 由于我是 C# 和 .net 平台的新手,因此我需要您的帮助来纠正这个问题。谢谢您,期待您的回复。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using NAudio.Wave;
using System.IO;
using System.Threading;

namespace audioTest2
{
    class Program
    {
        public static void Main()
        {

                while (true)
                {
                    Console.WriteLine("Waiting for broadcast");


                    UdpClient listener = new UdpClient(5000);
                    IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 5000);
                    byte[] buffer = listener.Receive(ref groupEP);
                    using (Stream ms = new MemoryStream())
                    {

                        buffer = listener.Receive(ref groupEP);
                        Console.WriteLine("read : " + buffer.Length);
                        ms.Write(buffer,0,buffer.Length);

                        ms.Position = 0;
                        using (WaveStream blockAlignedStream =
                            new BlockAlignReductionStream(
                                WaveFormatConversionStream.CreatePcmStream(
                                    new Mp3FileReader(ms))))
                        {
                            using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
                            {
                                waveOut.Init(blockAlignedStream);
                                waveOut.Play();
                                while (waveOut.PlaybackState == PlaybackState.Playing)
                                {
                                    System.Threading.Thread.Sleep(100);
                                }
                            }
                        }

                    }
                }
            }

        }

}

【问题讨论】:

    标签: sockets audio stream playback naudio


    【解决方案1】:

    我强烈建议您查看 NAudio 源代码(在 NAudioDemo 项目中)附带的 MP3 流媒体演示。读取 MP3 文件时不需要WaveFormatConversionStreamBlockAlignReduction 流,并且应该避免函数回调 - 改用WaveOutEvent。此外,Mp3FileReader 类专为您可以重新定位的整个 MP3 文件而设计。您需要的方法是在 MP3 帧到达时对其进行解析,单独解码,并以某种方式缓冲音频(例如,使用 BufferedWaveProvider )。

    【讨论】:

    • 非常感谢您的回复。您能否根据我的情况放置示例源或链接。再次感谢。
    • 我试过 BufferedWaveProvider 并且不知何故能够获得一些音频输出。音频输出仍然断断续续。我会尝试优化我的程序。我提到了这个例子。 Streaming Audio 再次感谢 Mark Heath 先生的热情回复。
    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2019-12-12
    • 1970-01-01
    相关资源
    最近更新 更多