我有一个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?
发布于 2016-03-27 18:15:53
当MediaStreamSample.CreateFromStreamAsync完成时,它以MediaStreamSample的形式返回新文件。
如果我明白你在这里想要的是什么,并举例说明你能做什么来完成它。
function sampleRequestedHandler(e) {
var request = e.request;
if (!MyCustomFormatParser.IsAtEndOfStream(randomAccessStream)) {
var deferral = request.getDeferral();
var inputStream = MyCustomFormatParser.getInputStream(randomAccessStream);
MediaStreamSample.createFromStreamAsync(inputStream, sampleSize, timeOffset).
then(function(sample) {
sample.duration = sampleDuration;
sample.keyFrame = true;
request.sample = sample;
deferral.complete();
});
}
}当请求示例时,您的自定义解析器从RandomAccessStream中提取音频数据,并仅返回音频示例的InputStream。
https://stackoverflow.com/questions/36084199
复制相似问题