我有一个 UWP 项目,我想使用 Windows.Media.Audio API 来播放文件。我不想使用 FileInputNode,而是想流式传输我的文件,这样我就可以精确地确定各种时间属性。
我找到了 MediaStreamSource API 并编写了以下代码以尝试解码 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 中生成的字节数组与我使用 DataReader 读取 StorageFile 时的结果完全相同。
MediaStreamSample.CreateFromStreamAsync 实际上是否将音频文件解码为浮点字节数组?还是在播放样本时在 MediaElement 中完成?
如果是这样,我如何解码音频文件,以便将生成的 AudioBuffer 提供回我的 FrameInputNode?