2016-03-18 6 views
5

У меня есть проект UWP, и я хочу использовать Windows.Media.Audio API для воспроизведения файла. Вместо использования FileInputNode я хочу передать файл, чтобы я мог точно определить различные временные свойства.Декодирование звука с использованием MediaStreamSource

Я нашел API MediaStreamSource и сделал следующий код в попытке декодировать 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 точно такой же, как когда я просто зачитал свой StorageFile с помощью DataReader.

Does 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 из только аудиосэмплов