Образец Naudio float и короткий образец Concentus.OggFile, преобразование mp3 в opus ogg

пытаясь преобразовать файл 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()

требуется короткий [] пример в качестве входных данных. все ли в порядке, как я конвертирую пример поставщика NAudio float[] в short[] ?

вероятно, нет, потому что выходной файл не может быть воспроизведен.

этот код не работает, и я понятия не имею, почему :"D


person patachi    schedule 24.02.2017    source источник


Ответы (1)


Это, вероятно, слишком поздно, но все равно. Насколько я могу судить, ваш код выглядит нормально, поэтому для отладки я бы попробовал всего несколько вещей:

  1. На самом деле в OggOpusWriteStream есть перегрузка WriteSamples(), которая принимает float[]. Попробуйте использовать это в первую очередь
  2. Я хотел бы убедиться, что mp3Reader.Read действительно производит столько данных, сколько вы думаете. Интересно, может ли он возвращать только один кадр декодированных данных или что-то в этом роде. Попробуйте записать данные как несжатый pcm и проверить их на работоспособность.

Я проверил, нет ли какой-нибудь ошибки в Concentus.Oggfile, так как вы только один раз используете WriteSamples(). Я подумал, что в этом случае, возможно, страницы не завершатся должным образом, но я ничего не могу найти.

person Logan S.    schedule 02.10.2017