2017-02-24 86 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(一次 - 我想,也許這將無法正常完成的網頁在這種情況下,但我找不到任何東西。