WP8.1 - c# -重叠音频与mediaccomposition类

本文关键字:mediaccomposition 音频 重叠 WP8 | 更新日期: 2023-09-27 18:01:15

我正在开发一个录音机应用程序,用于Windows Phone 8.1,将录音存储在本地存储和云存储服务上。

一切几乎都完成了,除了能够暂停正在进行的录音是这个应用程序的强烈要求,我必须完成它。现在,由于PauseRecordAsync()ResumeRecordAsync()在mediaccapture类中不可用于Windows Phone 8.1,但它们将在Windows 10中可用,我不得不做一个解决方案:每次按下暂停按钮时,音频块保存在临时文件夹中,该文件存储在数组中。当按下停止按钮时,最后一个块存储在数组中,并调用以下concatation函数并创建最终的音频临时文件:

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

问题是,当我播放文件时,所有的音频块都是从最后的音频文件开始播放的,同时,而不是在第一个结束后播放第二个,等等。他们都在耍花招。另一方面,文件的长度正确的,在所有音频文件播放完成后,它是完全沉默的。

WP8.1 - c# -重叠音频与mediaccomposition类

我明白了。我必须手动设置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;
    }
相关文章:
  • 没有找到相关文章