2016-03-18 9 views
5

Ich habe ein UWP-Projekt und möchte die Windows.Media.Audio API verwenden, um eine Datei abzuspielen. Anstatt den FileInputNode zu verwenden, möchte ich meine Datei streamen, damit ich verschiedene Timing-Eigenschaften genau bestimmen kann.Audio mit MediaStreamSource decodieren

I die Mediastreamsource API und aus dem folgenden Code in einem Versuch gefunden .wav-Datei

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; 
     } 
    } 

Anstatt das Ereignissystem verwendet wird, einen 16-Bit-PCM 2-Kanal zu dekodieren, habe ich eine Methode, die, wenn ausgelöst, Mein AudioFrameInputNode benötigt einen neuen AudioFrame.

Jetzt scheint es, dass das resultierende Byte-Array in der MediaStreamSample ist genau das gleiche wie wenn ich einfach meine StorageFile mit einem DataReader auslesen.

Dekodiert MediaStreamSample.CreateFromStreamAsync die Audiodatei tatsächlich in ein Float-Byte-Array? Oder wird das im MediaElement gemacht, wenn das Sample abgespielt wird?

Und wenn ja, wie kann ich ein Audiofile dekodieren, damit ich den resultierenden AudioBuffer wieder in meinen FrameInputNode liefern kann?

Antwort

1

Wenn MediaStreamSample.CreateFromStreamAsync abgeschlossen ist, wird die neue Datei als MediaStreamSample zurückgegeben.

Wenn ich verstanden habe, was Sie hier wollen, ist und Beispiel dafür, was Sie tun können, um es zu erreichen.

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(); 
      }); 
     } 
} 

Wenn Probe angefordert wird, Ihre benutzerdefinierten Parser extrahiert Audiodaten aus RandomAccessStream und gibt eine Input von nur Audio-Samples

Verwandte Themen