2017-02-24 83 views
1

试图MP3文件转换成OPUS OGG文件使用n音讯浮动样品和Concentus.OggFile短采样,转换MP3到OPUS OGG

n音讯: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()

需要短[]样品作为输入。 是否可以将NAudio float []样本提供程序转换为short []的方式?

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

这个代码不工作,我不知道为什么:“d

回答

0

这可能是太少太迟,但无论至于我可以告诉你的代码看起来不错,所以调试我会尝试。只是几件事情:

  1. 实际上有在OggOpusWriteStream一个WriteSamples()重载,接受浮动[]尝试使用第一
  2. 我将确保mp3Reader.Read实际上产生尽可能多的数据,你相信。它是,我想知道它是否可能只是返回一个解码数据帧或类似的东西写出来的数据为未压缩的PCM和健全检查它

我选中),看看是否有在Concentus.Oggfile一些bug,因为你永远只WriteSamples(一次 - 我想,也许这将无法正常完成的网页在这种情况下,但我找不到任何东西。