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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...