2016-03-18 78 views
5

私はUWPプロジェクトを持っており、Windows.Media.Audio APIを使用してファイルを再生したいとします。 FileInputNodeを使用する代わりに、さまざまなタイミングプロパティを正確に判断できるようにファイルをストリーミングします。MediaStreamSourceを使用したオーディオのデコード

Iは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に戻すことができるように、どのようにオーディオファイルをデコードできますか?

答えて

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を返します。
関連する問題