大佬教程收集整理的这篇文章主要介绍了Silverlight中调用麦克风模拟录音机设备,存储为WAV音频,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
public class WavAudioSink:AudioSink
{
// 设置需要记录的内存流
private MemoryStream _stream;
设置当前的音频格式 AudioFormat _format;
Stream backingStream
{
get { return _stream; }
}
AudioFormat CurrentFormat
{
_format; }
}
protected override void OnCaptureStarted()
{
_stream = new MemoryStream( 1024 );
}
OnCaptureStopped()
{
}
OnFormatChange(AudioFormat audioFormat)
{
if (audioFormat.WaveFormat != WaveFormatType.Pcm)
throw InvalidoperationException( " WavAudioSink只支持PCM音频格式 " );
_format audioFormat;
}
OnSamples( long sampleTime, sampleDuration,
byte [] sampleData)
{
新的音频数据到达,将它们写入流 _stream.Write(sampleData, 0 ,sampleData.Length);
}
}
SaveWAVHelper
{
static SavePcmToWav(Stream rawData,Stream output,AudioFormat audioFormat)
{
Argumentexception( Only PCM coding is supported. );
BinaryWriter bwOutput BinaryWriter(output);
-- RIFF 块 bwOutput.Write( RIFF .tocharArray());
包的总长度
计算的数据长度加上数据头的长度没有数据
写数据(44 - 4 ("RIFF") - 4 (当前数据)) bwOutput.Write(( uint )(rawData.Length + 36 ));
bwOutput.Write( WAVE .tocharArray());
-- FORMAT 块 fmt FORMAT 块的长度 (Binary,总是 0x10) ) 0x10 );
总是 0x01 ushort 0x01 通道数( 0x01=单声道,0x02=立体声) )audioFormat.ChAnnels);
采样率 (Binary,Hz为单位) )audioFormat.SamplesPerSecond);
字节每秒 )(audioFormat.bitsPerSample * audioFormat.SamplesPerSecond
audioFormat.ChAnnels / 8 ));
每个样品字节: 1=8 bit 单声道,2=8 bit 立体声 or 16 bit 单声道,4=16 bit 立体声 audioFormat.ChAnnels 每个样品字节 )audioFormat.bitsPerSamplE);
-- DATA 块 data DATA数据块的长度 )rawData.Length);
原始PCM数据如下
复位rawData地位,记住它的原点位置
恢复底。 originalRawDataStreamPosition rawData.Position;
rawData.Seek( .begin);
追加到输出流中的所有数据从rawData流 [] buffer [ 4096 ];
int read;
循环读取字节数据 while ((read rawData.Read(buffer,0)">)) > )
{
bwOutput.Write(buffer,read);
}
开始写入数据 rawData.Seek(originalRawDataStreamPosition,SeekOrigin.begin);
}
}
< Grid x:Name = LayoutRoot BACkground White Button Content 开始录制 Height 28 HorizontalAlignment Left
Margin 30,15,0 Name btnRecord VerticalAlignment Top
Width 71 Click btnRecord_Click /> 停止录制 150,0)">btnStopRecord btnStopRecord_Click 保存音频 268,0)">btnSaveWav btnSaveWav_Click </ Grid >
partial MainPage : UserControl
{
MainPage()
{
InitializeComponent();
btnRecord.IsEnabled true ;
btnStopRecord.IsEnabled false ;
btnSaveWav.IsEnabled ;
}
声明私有变量 WavAudioSink _wavSink;
Capturesource _capturesource;
SaveFileDialog _saveFileDialog SaveFileDialog()
{ Filter Audio files (*.wav)|*.wav };
btnRecord_Click( object sender,RoutedEventArgs E)
{
初始化_capturesource var audioDevice CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();
_capturesource Capturesource() { AudioCaptureDevice audioDevice };
有默认设置的设备且可以用来录制音频 (CaptureDeviceConfiguration.AllowedDeviceAccess ||
CaptureDeviceConfiguration.requestDeviceAccess())
{
判断当前没有开始录制音频 (_capturesource.State == CaptureState.Stopped)
{
初始化WavAudioSink _wavSink WavAudioSink();
_wavSink.Capturesource _capturesource;
开始录制音频 _capturesource.Start();
}
}
btnRecord.IsEnabled btnStopRecord_Click( E)
{
如果当前状态为开始录制,则停止录制 CaptureState.Started)
{
_capturesource.Stop();
}
btnRecord.IsEnabled btnSaveWav_Click( (_saveFileDialog.ShowDialog() )
{
;
}
保存Wav文件 Stream stream _saveFileDialog.openFile();
SaveWAVHelper.SavePcmToWav(_wavSink.backingStream,stream,_wavSink.CurrentFormat);
stream.Close();
messageBox.Show( 你的音频已经保存 );
btnRecord.IsEnabled ;
}
}
以上是大佬教程为你收集整理的Silverlight中调用麦克风模拟录音机设备,存储为WAV音频全部内容,希望文章能够帮你解决Silverlight中调用麦克风模拟录音机设备,存储为WAV音频所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。