Naudio float Sample和Concentus.OggFile short Sample,将mp3转换为opus ogg

时间:2017-02-24 11:55:30

标签: c# mp3 naudio ogg opus

尝试使用

将mp3文件转换为opus ogg文件

NAudio:https://github.com/naudio/NAudio

Concentus.OggFile https://github.com/lostromb/concentus.oggfile

using (var source = new MemoryStream(mp3File))
using (var mp3Reader = new MyAudioFileReader(source, FileReaderType.Mp3))
using (var memo = new MemoryStream())
{
    var bufferFloat = new float[mp3Reader.Length / (mp3Reader.WaveFormat.BitsPerSample / 8)];
    var count = mp3Reader.Read(bufferFloat, 0, bufferFloat.Length);

    //convert float to short 
    var buffShort = new short[count];
    var scale = (float)(short.MaxValue);
    for (int i = 0; i < count; i++)
    {
        buffShort[i] = (short)(bufferFloat[i] * scale);
    }
    //encoder
    var encoder = OpusEncoder.Create(48000, 
        mp3Reader.WaveFormat.Channels, 
        OpusApplication.OPUS_APPLICATION_AUDIO);

    encoder.Bitrate = 65536;//64kbps

    //tags
    var tags = new OpusTags();
    tags.Fields[OpusTagName.Title] = "Title";
    tags.Fields[OpusTagName.Artist] = "Artist";

    //
    var oggOut = new OpusOggWriteStream(encoder, memo, tags);

    oggOut.WriteSamples(buffShort, 0, buffShort.Length);
    oggOut.Finish();

    result = memo.ToArray();
}

我不知道基础知识,做了一些GDD,这是我得到的结果。

  

OpusOggWriteStream.WriteSamples()

需要short []样本作为输入。 我将NAudio float []示例提供程序转换为short []的方式是否正常?

可能不是cuz输出文件无法播放。

此代码不起作用,我不明白为什么:“D

1 个答案:

答案 0 :(得分:0)

这可能太晚了,但无论如何。据我所知,你的代码看起来很好,所以要调试我会尝试一些事情:

  1. OggOpusWriteStream中实际上有一个WriteSamples()重载,它接受float []。尝试使用第一个
  2. 我会确保mp3Reader.Read实际产生的数据与你认为的一样多。我想知道它是否只能返回一帧解码数据或类似的东西。尝试将数据写为未压缩的pcm并进行健全检查
  3. 我检查了Concentus.Ogg文件中是否有一些错误,因为你只有一次WriteSamples() - 我想也许在那种情况下它不能正确地完成页面,但我找不到任何东西。