2016-03-18 94 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