Я разрабатываю ДИКТОФОН приложение для 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 и после того, как все аудиофайлы закончили играть, это полная тишина.