如何解析音频的字节流


我已经通过Windows Phone 的 Microphone录制了一段时间的音频,数据是byte[]类型。现在我想要知道麦克风有无声音。由于库中没有提供直接的方法,所有我想能不能通过分析byte数组来得到音频的具体信息,如高峰区,音量等。

后面我还想对这个数据进行降噪处理,识别出最明显的声音,关键现在对数据的内容一无所知。

观察了byte中的数据,几乎没有规律,不知道有没有熟悉音频的朋友能够帮忙回答一下?

下面是录音的一个Samplecode

   
  public partial class MainPage : PhoneApplicationPage
  
{
Microphone microphone = Microphone.Default;
byte[] buffer;
MemoryStream stream = new MemoryStream();
SoundEffect sound;

// Constructor
public MainPage()
{
InitializeComponent();
DispatcherTimer dt = new DispatcherTimer();
dt.Interval = TimeSpan.FromMilliseconds(33);
dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
dt.Start();

microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady);

}

//写数据
void microphone_BufferReady(object sender, EventArgs e)
{
microphone.GetData(buffer);
stream.Write(buffer, 0, buffer.Length);
//throw new NotImplementedException();

}

//录音
private void recordButton_Click(object sender, RoutedEventArgs e)
{
microphone.BufferDuration = TimeSpan.FromMilliseconds(1000);
buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
microphone.Start();
}

//停止
private void stopButton_Click(object sender, RoutedEventArgs e)
{
if (microphone.State == MicrophoneState.Started)
{
microphone.Stop();
}
}

//播放
private void playButton_Click(object sender, RoutedEventArgs e)
{
sound = new SoundEffect(stream.ToArray(), microphone.SampleRate, AudioChannels.Mono);
Debug.WriteLine(sound.Duration.ToString());
sound.Play();
}
}

音视频开发 WindowsPhone

无关风月葬花 12 years, 7 months ago

Windows Phone我也没有接触过,不知道具体的音频流是什么格式,不过99%是PCM Wave吧。两个字节合在一起表示一个short,小端格式。如果是立体声的话,左右间隔,第一个是左,第二个是右,第三个是左,依此类推;单声道的话就是连续的数据就行了。
可以用BitConverter把连续的字节转成short。

smallblack answered 12 years, 7 months ago

Your Answer