如何解决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 举报,一经查实,本站将立刻删除。