Я использую Naudio для реализации системы воспроизведения звука, кэшированной в памяти, основанной на оригинальном CachedSound и CachedSoundSoundSoundSoundSoundSoundSoundSoundSoundSoundSamplePovider. Все работает, как и ожидалось при использовании 32-разрядных файлов IEEE Float WAV. public int Read(float[] buffer, int offset, int count)< /code>
Похоже, что вместо получения плавания [] метод неожиданно проходит байт [], что приводит к исключению времени выполнения. < /p>
Это код, который я попробовал: < /p>
CachedSound smallNowCached2 = new CachedSound(@"short녹음12.wav");
CachedSoundSampleProvider CachedsampleProvider = new CachedSoundSampleProvider(smallNowCached2);
CachedSound bigNowCached2 = new CachedSound(@"20241201120000_녹음12.wav");
CachedSoundSampleProvider CachedsampleProvider3 = new CachedSoundSampleProvider(bigNowCached2);
var concat2 = new myConcatenatingSampleProvider(new[] { CachedsampleProvider, CachedsampleProvider3 });
WasapiOut wasapiOut = new WasapiOut();
wasapiOut.Init(concat2);
wasapiOut.Play();
< /code>
Оригинальный CachedSound CachedSoundSampleProvider: < /p>
public class CachedSound
{
public float[] AudioData { get; private set; }
public WaveFormat WaveFormat { get; private set; }
public CachedSound(string audioFileName)
{
using (var audioFileReader = new AudioFileReader(audioFileName))
{
// TODO: could add resampling in here if required
WaveFormat = audioFileReader.WaveFormat;
var wholeFile = new List((int)(audioFileReader.Length / 4));
var readBuffer = new float[audioFileReader.WaveFormat.SampleRate * audioFileReader.WaveFormat.Channels];
int samplesRead;
while ((samplesRead = audioFileReader.Read(readBuffer, 0, readBuffer.Length)) > 0)
{
wholeFile.AddRange(readBuffer.Take(samplesRead));
}
AudioData = wholeFile.ToArray();
}
}
}
public class CachedSoundSampleProvider : ISampleProvider
{
private readonly CachedSound cachedSound;
private long position;
public CachedSoundSampleProvider(CachedSound cachedSound)
{
this.cachedSound = cachedSound;
}
public int Read(float[] buffer, int offset, int count)
{
var availableSamples = cachedSound.AudioData.Length - position;
var samplesToCopy = Math.Min(availableSamples, count);
Array.Copy(cachedSound.AudioData, position, buffer, offset, samplesToCopy);
position += samplesToCopy;
return (int)samplesToCopy;
}
public WaveFormat WaveFormat { get { return cachedSound.WaveFormat; } }
}
< /code>
Эта реализация отлично работает для аудиофайлов на основе плавучих, но сбой при использовании 16-битных WAVS.public class MyCachedSound
{
public float[] AudioData { get; }
public WaveFormat WaveFormat { get; }
public MyCachedSound(string audioFileName)
{
using (var reader = new AudioFileReader(audioFileName))
{
WaveFormat = reader.WaveFormat;
var buffer = new float[reader.WaveFormat.SampleRate * reader.WaveFormat.Channels];
var audioData = new List();
int read;
while ((read = reader.Read(buffer, 0, buffer.Length)) > 0)
{
for (int i = 0; i < read; i++)
audioData.Add(buffer);
}
AudioData = audioData.ToArray();
}
}
}
public class MyCachedSoundSampleProvider : ISampleProvider
{
private readonly MyCachedSound cachedSound;
private long position;
public WaveFormat WaveFormat => cachedSound.WaveFormat;
public int Read(float[] buffer, int offset, int count)
{
var samplesToCopy = Math.Min(cachedSound.AudioData.Length - position, count);
for (int i = 0; i < samplesToCopy; i++)
buffer[offset + i] = cachedSound.AudioData[position + i];
position += samplesToCopy;
return (int)samplesToCopy;
}
}
< /code>
Эта версия работает даже с 16-битными входными файлами PCM. < /p>
Мои вопросы:
Почему Byte [] передается в чтение (Buffer [], ...) в исходной реализации при использовании файлов PCM? Я ожидал, что только плавает [] на основе подписи метода. < /P>
Является ли мой обходной путь безопасен и формат-алкоголь? Будет ли он продолжать работать правильно для других глубин битов, таких как 24-битный PCM или 32-битный поплавок, или есть кромки, которые мне нужно знать?
Подробнее здесь: https://stackoverflow.com/questions/796 ... in-my-isam
Почему Byte [] передается в чтение (Buffer [] Buffer, Int Offset, Int Count) в моей реализации iSampleProvider? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как преобразовать список[int, int, int] в кортеж[int, int, int], а не в кортеж[int, ...]
Anonymous » » в форуме Python - 0 Ответы
- 288 Просмотры
-
Последнее сообщение Anonymous
-