Я использую 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#
Место общения программистов C#
1750404278
Anonymous
Я использую 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[i]);
}
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-битный поплавок, или есть кромки, которые мне нужно знать?
Подробнее здесь: [url]https://stackoverflow.com/questions/79672991/why-is-byte-passed-into-readfloat-buffer-int-offset-int-count-in-my-isam[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия