2015-07-06 2 views
0

Я разрабатываю ДИКТОФОН приложение для Windows Phone 8.1, который хранит записи на локальном хранилище и сервис облачного хранения.WP8.1 - C# - Перекрытие аудио с MediaComposition класса

Все почти выполнено, за исключением того факта, что возможность приостановки текущей записи является сильным требованием для этого приложения, и я должен это сделать. Теперь, так как PauseRecordAsync() и ResumeRecordAsync() не доступны для Windows Phone 8.1 в классе MediaCapture, но они будут доступны в Windows 10, я должен был сделать обходной путь: Каждый раз, когда пауза , звуковой фрагмент сохраняется в папке temp, и этот файл сохраняется в массиве. При нажатии на кнопку остановки, последний кусок хранится в массиве и следующая функция конкатенации называется и окончательный звуковой файл Темп создан:

public async Task<IStorageFile> ConcatenateAudio([ReadOnlyArray]IStorageFile[] audioFiles, IStorageFolder outputFolder, string outputfileName) 
    { 
      IStorageFile _OutputFile = await outputFolder.CreateFileAsync(outputfileName, CreationCollisionOption.ReplaceExisting); 
      MediaComposition _MediaComposition = new MediaComposition(); 
      MediaEncodingProfile _MediaEncodingProfile = MediaEncodingProfile.CreateM4a(AudioEncodingQuality.High); 
      foreach (IStorageFile _AudioFile in audioFiles) 
      { 
       if(_AudioFile != null) 
       { 
        BackgroundAudioTrack _BackgroundAudioTrack = await BackgroundAudioTrack.CreateFromFileAsync(_AudioFile); 
        MediaClip _MediaClip = MediaClip.CreateFromColor(Windows.UI.Colors.Black, _BackgroundAudioTrack.TrimmedDuration); // A dummy black video is created witn the size of the current audio chunk. 
                                     // Without this, the duration of the MediaComposition object is always 0. 
                                     // It's a messy workaround but it gets the job done. 
                                     // Windows 10 will dirrectly support PauseRecordAsync() and ResumeRecordAsync() for MediaCapture tho'. Yay! :D 
        _MediaClip.Volume = 0; 
        _BackgroundAudioTrack.Volume = 1; 
        _MediaComposition.Clips.Add(_MediaClip); 
        _MediaComposition.BackgroundAudioTracks.Add(_BackgroundAudioTrack); 
       } 
      } 
      TranscodeFailureReason _TranscodeFailureReason = await _MediaComposition.RenderToFileAsync(_OutputFile, MediaTrimmingPreference.Fast, _MediaEncodingProfile); 
      if (_TranscodeFailureReason != TranscodeFailureReason.None) 
      { 
       throw new Exception("Audio Concatenation Failed: " + _TranscodeFailureReason.ToString()); 
      } 
      return _OutputFile; 
    } 

Проблема в том, что когда я играю в файл, все звуковые фрагменты воспроизводятся с начала финального аудиофайла в то же время вместо того, чтобы играть второго сразу после первого и так далее. Они все играют друг над другом. длина файла, с другой стороны, correct и после того, как все аудиофайлы закончили играть, это полная тишина.

ответ

2

Я понял. Мне пришлось вручную установить задержка для BackgroundAudioTrack. Ниже приведен рабочий код:

public async Task<IStorageFile> ConcatenateAudio([ReadOnlyArray]IStorageFile[] audioFiles, IStorageFolder outputFolder, string outputfileName) 
    { 
     IStorageFile _OutputFile = await outputFolder.CreateFileAsync(outputfileName, CreationCollisionOption.ReplaceExisting); 
     MediaComposition _MediaComposition = new MediaComposition(); 
     MediaEncodingProfile _MediaEncodingProfile = MediaEncodingProfile.CreateM4a(AudioEncodingQuality.High); 
     TimeSpan totalDelay = TimeSpan.Zero; 
     foreach (IStorageFile _AudioFile in audioFiles) 
     { 
      if (_AudioFile != null) 
      { 
       BackgroundAudioTrack _BackgroundAudioTrack = await BackgroundAudioTrack.CreateFromFileAsync(_AudioFile); 

       MediaClip _MediaClip = MediaClip.CreateFromColor(Windows.UI.Colors.Black, _BackgroundAudioTrack.TrimmedDuration); // A dummy black video is created witn the size of the current audio chunk. 
                                    // Without this, the duration of the MediaComposition object is always 0. 
                                    // It's a messy workaround but it gets the job done. 
                                    // Windows 10 will dirrectly support PauseRecordAsync() and ResumeRecordAsync() for MediaCapture tho'. Yay! :D 
       _MediaClip.Volume = 0; 
       _BackgroundAudioTrack.Volume = 1; 
       _MediaComposition.Clips.Add(_MediaClip); 
       _MediaComposition.BackgroundAudioTracks.Add(_BackgroundAudioTrack); 
       _BackgroundAudioTrack.Delay = totalDelay; 
       totalDelay += _BackgroundAudioTrack.TrimmedDuration; 
      } 
     } 
     TranscodeFailureReason _TranscodeFailureReason = await _MediaComposition.RenderToFileAsync(_OutputFile, MediaTrimmingPreference.Fast, _MediaEncodingProfile); 
     if (_TranscodeFailureReason != TranscodeFailureReason.None) 
     { 
      throw new Exception("Audio Concatenation Failed: " + _TranscodeFailureReason.ToString()); 
     } 
     return _OutputFile; 
    } 
Смежные вопросы