【问题标题】:How to live stream mp3 frames by frames in naudio如何在 naudio 中逐帧直播 mp3 帧
【发布时间】:2016-03-01 20:37:41
【问题描述】:

我正在尝试在录制时以 mp3 格式实时流式传输音频,但我无法获得良好的流式传输质量。

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

我喜欢在录制时逐帧流式传输连续的 mp3。有什么合适的方法吗?

【问题讨论】:

  • 您是否对每 10 秒的 mp3 进行单独编码?如果是这样,由于 mp3 的限制(mp3 不能是任意长度,并且必须是帧大小的倍数,通常为 1152 个样本),您将永远无法“端到端”无间隙地对接它们。您还需要考虑编码器有一个“加速”时间,这意味着您将在边界处获得可听见的伪影。您需要连续编码音频,而不是每 10 秒间隔开始一个新的编码会话。
  • 是的,我每 10 秒单独编码一次。但是如何同时编码和获取帧以将帧发送到网络?通过使用 LameMP3FileWriter 我只能编写流。有什么替代方法吗?
  • 我曾经写过一个 mp3 流媒体,但在一台旧计算机上(我虚拟化了它)。我去看看有没有……
  • 假设你使用this LameMP3FileWriter,构造函数接受一个Stream。为什么不提供网络流而不是文件流?你怎么直播?通过 HTTP?你的设置是什么?
  • 我正在通过 UDP 流式传输帧

标签: c# naudio live-streaming


【解决方案1】:

鉴于 LameMP3FileWriter 需要一个 Stream 来写入,我建议实现您自己的流类,并简单地将到达 Write 方法的所有数据写入 UDP。然后你可以将它传递给 LameMP3FileWriter。

这是一个简单的流类,应该可以帮助您入门。您需要填写方法Write 的空白,可能还有Flush。我想您可以将其他所有内容都保留为 NotImplemented。

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();} 
    }
}

【讨论】:

  • 我对flush没什么困惑
  • @Aran:你可能会在 Flush 中什么都不做,因为你可能不需要缓冲任何东西......只需在 Write 方法中将所有内容写入 UDP,你应该会很好去。我很想听听这对你有什么影响。
  • @Aran:当然,如果 LameMP3FileWriter 确实与 Position 属性混淆,您将回到绘图板上。我没有检查。
  • 你当然会实施并测试它。
  • @Aran:我刚刚检查过......它会写入和刷新,所以只需理清 Write 方法,让 Flush 实现什么都不做,它应该 工作。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2011-05-16
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多