2016-03-18 90 views
5

我有一个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是否实际将audiofile解码为浮点字节数组?或者当MediaElement在播放样本时完成这项工作?

如果是这样,我怎么能解码一个audiofile所以我可以提供产生的AudioBuffer回到我的FrameInputNode?

回答

1

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