C# 如何在naudio中逐帧实时播放mp3

C# 如何在naudio中逐帧实时播放mp3,c#,naudio,live-streaming,C#,Naudio,Live Streaming,我试图在录制时以mp3格式实时播放音频,但无法获得良好的播放质量 我正在做的是从“WI_DataAvailable”获取10秒的PCM数据,并将其转换为MP3,然后在网络中发送帧。它在10秒的数据之间几乎不产生噪音 我喜欢在录音时一帧一帧地播放mp3。有什么合适的方法吗?鉴于LameMP3FileWriter需要写入流,我建议实现您自己的流类,只需将write方法中到达的所有数据写入UDP。然后您可以将其传递给LameMP3FileWriter 这里有一个简单的流类,应该可以让您开始学习。您需要

我试图在录制时以mp3格式实时播放音频,但无法获得良好的播放质量

我正在做的是从“WI_DataAvailable”获取10秒的PCM数据,并将其转换为MP3,然后在网络中发送帧。它在10秒的数据之间几乎不产生噪音


我喜欢在录音时一帧一帧地播放mp3。有什么合适的方法吗?

鉴于LameMP3FileWriter需要写入流,我建议实现您自己的流类,只需将
write
方法中到达的所有数据写入UDP。然后您可以将其传递给LameMP3FileWriter

这里有一个简单的流类,应该可以让您开始学习。您需要为方法
Write
和可能的
Flush
填充空格。我想你可以把其他的事情都不做

public class UdpStream:Stream
{
    public override int Read(byte[] buffer, int offset, int count)
    {
        //you'll definitely need to implement this...
        //write the buffer to UDP
    }

    public override void Flush()
    {
        //you might need to implement this
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override bool CanSeek
    {
        get { return false; }
    }

    public override bool CanWrite
    {
        get { return true; }
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        throw new NotImplementedException();
    }

    public override void SetLength(long value)
    {
        throw new NotImplementedException();
    }


    public override void Write(byte[] buffer, int offset, int count)
    {
        throw new NotImplementedException();
    }

    public override long Length
    {
        get { throw new NotImplementedException(); }
    }

    public override long Position { 
        get{throw new NotImplementedException();} 
        set{throw new NotImplementedException();} 
    }
}

您是否对每10秒的mp3单独编码?如果是这样,由于mp3的限制,您将永远无法在没有间隙的情况下“端到端”对接它们(mp3不能是任意长度,并且必须是帧大小的倍数,通常是1152个样本)。你还需要考虑到编码器有一个“上升”时间,这意味着你会在你的边界得到可听的伪影。您需要连续编码音频,而不是每10秒开始一次新的编码会话。是的,我每10秒单独编码一次。但是如何同时编码和获取帧以将帧发送到网络中呢?通过使用LameMP3FileWriter,我只能写入流。有没有其他方法呢?我曾经在一台旧电脑(我虚拟化了)上写过一段mp3流。我将查看它是否存在……假设您正在使用,构造函数将获取一个流。为什么不提供网络流而不是文件流?你怎么样?通过HTTP?你们的设置是什么?我正在通过UDPI流式传输帧,我对flush实际上在做什么不太清楚stream@Aran:您可能不需要在Flush中执行任何操作,因为您可能不需要缓冲任何内容。。。只要用write方法将所有内容写入UDP,就可以了。我很想听听你是怎么做的。@Aran:当然,如果Lammp3FileWriter真的弄乱了
Position
属性,你就回到绘图板上来。我没有检查。你确定我会实现并测试它。@Aran:我刚刚检查过。。。它会写入和刷新,所以只需整理一下写入方法,让Flush实现什么都不做,它就可以工作了。