首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MediaStreamSource解码音频

用MediaStreamSource解码音频
EN

Stack Overflow用户
提问于 2016-03-18 12:18:11
回答 1查看 734关注 0票数 5

我有一个UWP项目,我想使用Windows.Media.Audio API来播放一个文件。我不使用FileInputNode,而是要流我的文件,这样我就可以精确地确定各种定时属性。

我找到了MediaStreamSource API,并编写了以下代码,试图解码一个16位PCM 2通道.wav文件

代码语言:javascript
复制
 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?

EN

回答 1

Stack Overflow用户

发布于 2016-03-27 18:15:53

MediaStreamSample.CreateFromStreamAsync完成时,它以MediaStreamSample的形式返回新文件。

如果我明白你在这里想要的是什么,并举例说明你能做什么来完成它。

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36084199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档