У меня есть проект UWP, и я хочу использовать Windows.Media.Audio API для воспроизведения файла. Вместо использования FileInputNode я хочу передать файл, чтобы я мог точно определить различные временные свойства.Декодирование звука с использованием MediaStreamSource
Я нашел API MediaStreamSource и сделал следующий код в попытке декодировать 16 бит PCM 2 канала в WAV-файла
public async Task<Windows.Storage.Streams.Buffer> GetBuffer()
{
// check if the sample requested byte offset is within the file size
if (byteOffset + BufferSize <= mssStream.Size)
{
inputStream = mssStream.GetInputStreamAt(byteOffset);
// create the MediaStreamSample and assign to the request object.
// You could also create the MediaStreamSample using createFromBuffer(...)
MediaStreamSample sample = await MediaStreamSample.CreateFromStreamAsync(inputStream, BufferSize, timeOffset);
sample.Duration = sampleDuration;
sample.KeyFrame = true;
// increment the time and byte offset
byteOffset += BufferSize;
timeOffset = timeOffset.Add(sampleDuration);
return sample.Buffer;
}
else
{
return null;
}
}
Вместо того чтобы использовать систему событий, я сделал метод, который вызывается при моему AudioFrameInputNode нужен новый AudioFrame.
Теперь кажется, что полученный массив байтов в MediaStreamSample точно такой же, как когда я просто зачитал свой StorageFile с помощью DataReader.
Does MediaStreamSample.CreateFromStreamAsync фактически декодирует аудиофайл в массив байтов с поплавком? Или это делается в MediaElement, когда он воспроизводит образец?
И если да, то как я могу декодировать аудиофайл, чтобы я мог вернуть полученный AudioBuffer в свой FrameInputNode?