WP8.1-C#-与MediaComposition类重叠的音频

WP8.1-C#-与MediaComposition类重叠的音频,c#,audio,windows-phone-8.1,windows-phone,overlapping,C#,Audio,Windows Phone 8.1,Windows Phone,Overlapping,我正在为Windows Phone 8.1开发一个语音录制应用程序,它将录制的内容存储在本地存储和云存储服务中 一切都差不多完成了,除了能够暂停正在进行的录音是这个应用程序的一个强烈要求,我必须完成它。 现在,由于在MediaCapture类中,Windows Phone 8.1无法使用PauseRecordAsync()和ResumeRecordAsync(),但它们在Windows 10中也可以使用,因此我不得不做一个变通:每次按下暂停按钮,一个音频块就会保存在临时文件夹中,该文件存储在一个

我正在为Windows Phone 8.1开发一个语音录制应用程序,它将录制的内容存储在本地存储和云存储服务中

一切都差不多完成了,除了能够暂停正在进行的录音是这个应用程序的一个强烈要求,我必须完成它。 现在,由于在MediaCapture类中,Windows Phone 8.1无法使用PauseRecordAsync()ResumeRecordAsync(),但它们在Windows 10中也可以使用,因此我不得不做一个变通:每次按下暂停按钮,一个音频块就会保存在临时文件夹中,该文件存储在一个数组中。按下停止按钮时,最后一个数据块存储在阵列中,并调用以下连接函数并创建最终音频临时文件:

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;
    }
public async Task ConcatenateAudio([ReadOnlyArray]IStorageFile[]音频文件,IStorageFolder outputFolder,string outputfileName)
{
IStorageFile\u OutputFile=await outputFolder.CreateFileAsync(outputfileName,CreationCollisionOption.ReplaceExisting);
MediaComposition_MediaComposition=新的MediaComposition();
MediaEncodingProfile _MediaEncodingProfile=MediaEncodingProfile.CreateM4a(AudioEncodingQuality.High);
foreach(IStorageFile\u AudioFile中的AudioFile)
{
如果(_AudioFile!=null)
{
BackgroundAudioTrack\u BackgroundAudioTrack=等待BackgroundAudioTrack.CreateFromFileAsync(\u AudioFile);
MediaClip _MediaClip=MediaClip.CreateFromColor(Windows.UI.Colors.Black,_BackgroundAudioTrack.TrimmedDuration);//将创建一个具有当前音频块大小的虚拟黑色视频。
//否则,MediaComposition对象的持续时间始终为0。
//这是一个混乱的解决办法,但它完成了工作。
//Windows 10将直接支持MediaCapture的PauseRecordAsync()和ResumeRecordAsync()
_MediaClip.Volume=0;
_背景音轨。音量=1;
_MediaComposition.Clips.Add(_MediaClip);
_MediaComposition.BackgroundAudioTracks.Add(_BackgroundAudioTrack);
}
}
TranscodeFailureReason\u TranscodeFailureReason=Wait\u MediaComposition.RenderToFileAsync(\u OutputFile,MediaTrimmingPreference.Fast,\u MediaEncodingProfile);
如果(_TranscodeFailureReason!=TranscodeFailureReason.None)
{
抛出新异常(“音频连接失败:+\u TranscodeFailureReason.ToString());
}
返回输出文件;
}

问题在于,当我播放文件时,所有音频块都是从最后一个音频文件的开头同时播放的,而不是在第一个音频文件结束后立即播放第二个音频文件,依此类推。他们都在互相竞争。另一方面,文件的长度正确的,在所有音频文件播放完毕后,完全没有声音。

我想出来了。我必须手动设置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;
    }
public async Task ConcatenateAudio([ReadOnlyArray]IStorageFile[]音频文件,IStorageFolder outputFolder,string outputfileName)
{
IStorageFile\u OutputFile=await outputFolder.CreateFileAsync(outputfileName,CreationCollisionOption.ReplaceExisting);
MediaComposition_MediaComposition=新的MediaComposition();
MediaEncodingProfile _MediaEncodingProfile=MediaEncodingProfile.CreateM4a(AudioEncodingQuality.High);
TimeSpan totalDelay=TimeSpan.0;
foreach(IStorageFile\u AudioFile中的AudioFile)
{
如果(_AudioFile!=null)
{
BackgroundAudioTrack\u BackgroundAudioTrack=等待BackgroundAudioTrack.CreateFromFileAsync(\u AudioFile);
MediaClip _MediaClip=MediaClip.CreateFromColor(Windows.UI.Colors.Black,_BackgroundAudioTrack.TrimmedDuration);//将创建一个具有当前音频块大小的虚拟黑色视频。
//否则,MediaComposition对象的持续时间始终为0。
//这是一个混乱的解决办法,但它完成了工作。
//Windows 10将直接支持MediaCapture的PauseRecordAsync()和ResumeRecordAsync()
_MediaClip.Volume=0;
_背景音轨。音量=1;
_MediaComposition.Clips.Add(_MediaClip);
_MediaComposition.BackgroundAudioTracks.Add(_BackgroundAudioTrack);
_BackgroundAudioTrack.Delay=总延迟;
totalDelay+=\u BackgroundAudioTrack.TrimmedDuration;
}
}
TranscodeFailureReason\u TranscodeFailureReason=Wait\u MediaComposition.RenderToFileAsync(\u OutputFile,MediaTrimmingPreference.Fast,\u MediaEncodingProfile);
如果(_TranscodeFailureReason!=TranscodeFailureReason.None)
{
抛出新异常(“音频Concatena