UWP:将AudioFrame保存到mp3文件

问题描述

我是UWP世界的新手。我使用MediaCapture API来记录捕获的媒体:

public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            InitMediaCapture();

        }

        private MediaCapture mediaCapture;
        private MediaFrameReader mediaFrameReader;

        // Create and initialze the MediaCapture object.
        public async void InitMediaCapture()
        {
            mediaCapture = new MediaCapture();
            MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings()
            {
                StreamingCaptureMode = StreamingCaptureMode.Audio,};
            await mediaCapture.InitializeAsync(settings);

            var audioFrameSources = mediaCapture.FrameSources.Where(x => x.Value.Info.MediaStreamType == MediaStreamType.Audio);

            if (audioFrameSources.Count() == 0)
            {
                Debug.WriteLine("No audio frame source was found.");
                return;
            }

            MediaFrameSource frameSource = audioFrameSources.FirstOrDefault().Value;

            MediaFrameFormat format = frameSource.CurrentFormat;
            if (format.Subtype != MediaEncodingSubtypes.Float)
            {
                return;
            }

            /*
            if (format.AudioEncodingProperties.ChannelCount != 1
                || format.AudioEncodingProperties.SampleRate != 48000)
            {
                return;
            }*/

            mediaFrameReader = await mediaCapture.CreateFrameReaderAsync(frameSource);

            // Optionally set acquisition mode. Buffered is the default mode for audio.
            mediaFrameReader.AcquisitionMode = MediaFrameReaderAcquisitionMode.Buffered;

            mediaFrameReader.FrameArrived += MediaFrameReader_AudioFrameArrived;

            var status = await mediaFrameReader.StartAsync();

            if (status != MediaFrameReaderStartStatus.Success)
            {
                Debug.WriteLine("The MediaFrameReader Couldn't start.");
            }
        }

        private void MediaFrameReader_AudioFrameArrived(MediaFrameReader sender,MediaFrameArrivedEventArgs args)
        {
            using (MediaFrameReference reference = sender.TryAcquireLatestFrame())
            {
                if (reference != null)
                {
                    byte[] arr = ProcessAudioFrameAsync(reference.AudioMediaFrame);

                    SaveBytesAsync(arr);           
                }
            }
        }

        private async void SaveBytesAsync(byte[] arr)
        {
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            StorageFile sampleFile = await storageFolder.CreateFileAsync("test.mp3",CreationCollisionoption.ReplaceExisting);

            await FileIO.WriteBytesAsync(sampleFile,arr);
        }

        unsafe private byte[] ProcessAudioFrameAsync(AudioMediaFrame audioMediaFrame)
        {

            using (AudioFrame audioFrame = audioMediaFrame.GetAudioFrame())
            using (AudioBuffer buffer = audioFrame.LockBuffer(AudioBufferAccessMode.Read))
            using (IMemoryBufferReference reference = buffer.CreateReference())
            {
                byte* dataInBytes;
                uint capacityInBytes;
            
                ((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes,out capacityInBytes);

                byte[] arr = new byte[capacityInBytes];
                Marshal.copy((IntPtr)dataInBytes,arr,(int)capacityInBytes);

                return arr;
            }
        }

    }

代码尝试将每个AudioFrame字节保存到mp3文件。确实可以,但是无法播放该文件文件无法播放。这可能是因为文件类型不受支持文件扩展名不正确或文件已损坏。

如何将每个AudioFrame保存到mp3文件?有可能吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)