Naudio float Sample и Concentus.OggFile short Sample, конвертирование 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
1 ответ
Это, вероятно, слишком мало, слишком поздно, но что угодно. Насколько я могу судить, ваш код выглядит нормально, поэтому для отладки я бы попробовал всего несколько вещей:
- На самом деле в OggOpusWriteStream есть перегрузка WriteSamples(), которая принимает float[]. Попробуйте использовать это сначала
- Я хотел бы убедиться, что mp3Reader.Read на самом деле производит столько данных, сколько вы считаете, что это будет. Интересно, может ли он возвращать только один кадр декодированных данных или что-то в этом роде? Попробуйте записать данные как несжатый PCM и проверить их работоспособность
Я проверил, есть ли какая-то ошибка в Concentus.Oggfile, так как вы когда-либо записывали WriteSamples() только один раз - я подумал, что, возможно, в этом случае он не завершит работу должным образом, но я ничего не могу найти.