C#(录音)中CaptureBuffer类的使用,(缓冲区数据读取问题)

飞喵 2009-06-08 03:53:19
就是用网上普遍找到的原程序

http://zhidao.baidu.com/question/74661123.html

进行录音。

其中缓冲区通知事件,读取数据为:

CaptureData = (byte[])mRecBuffer.Read(mNextCaptureOffset, typeof(byte), LockFlag.None, LockSize);

(通知大小为2000)

为什么每次读取的缓冲区声音数据不一样,而且很大,几千或上万byte。

因为我是利用这个程序,采集声音后,发送到一个设备。发送要求每次发送的音频数据不能大于 13*80byte。

但是这个读取缓冲区数据的时候,总是很大,如何设置才能让他在一定范围内呢?

谢谢啦,高分求。

注:现在如果不管这个CaptureData 读取是否超过13*80,而是截取13*80来发送,对面可以听见声音,也算清晰。但是这样总归是丢失了好多数据啊。如果CaptureData 读取后可以再13*80范围内,就可以不丢失数据了。该设置什么呢?

其中:

private WaveFormat CreateWaveFormat()
{
WaveFormat format = new WaveFormat();
format.FormatTag = WaveFormatTag.Pcm; // PCM
format.SamplesPerSecond = 8000; // KHz
format.BitsPerSample = 16; //Bit
format.Channels = 1; // Mono
format.BlockAlign = (short)(format.Channels * (format.BitsPerSample / 8));
format.AverageBytesPerSecond = format.BlockAlign * format.SamplesPerSecond;
return format;
}

调采样频率好像没有用,还是很大。

mNotifySize = (1024 > mWavFormat.AverageBytesPerSecond / 8) ? 1024 : (mWavFormat.AverageBytesPerSecond / 8);

这个通知size就算设置很小也没有用啊。


在线等,急。
...全文
504 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
syj314 2011-11-17
  • 打赏
  • 举报
回复
我也报错啊,高人给予一点指示。提示“值不在预期的范围内”
zaoxiaoren 2011-08-03
  • 打赏
  • 举报
回复
CaptureBuffer是怎么使用的呀 为什么我报错应用程序错误
vicen25 2010-05-20
  • 打赏
  • 举报
回复
dsfgsdfgsdfgsdf
光宇广贞 2009-06-08
  • 打赏
  • 举报
回复

byte[] bfuck = (byte[])buffer.Read(....); // 读了一个一百万的数组……当然了,比较夸张
byte[] b2fuck = new byte[10000];

int ifuck = 0;

while ( ifuck + 10000 < bfuck.Length )
{
Array.Copy(bfuck, ifuck, b2fuck, 10000 );
SendFuck(b2fuck); // 将信息发送
ifuck += 10000; // 加上这句
}

Array.Copy(bfuck, ifuck, b2fuck, bfuck.Length - ifuck );
SendFuck(b2fuck); // 将最后的信息发送


比4楼加上这句……我忘了……
[color=#FF0000]ifuck += 10000; // 加上这句[/color]
xudongdong_1990 2009-06-08
  • 打赏
  • 举报
回复
顶!
光宇广贞 2009-06-08
  • 打赏
  • 举报
回复
其实我觉得,如果有限长度的数据,并不影响双方之间通信话,那么只要截掉就好了,就像你现在所做的那样。

或者你可以这么办。

你先把所有的数据都读进到一个数组里面,然后用游标,比如说,你得到一个一百万大小的数组,每次发送一万个,那么如是:


byte[] bfuck = (byte[])buffer.Read(....); // 读了一个一百万的数组……当然了,比较夸张
byte[] b2fuck = new byte[10000];

int ifuck = 0;

while ( ifuck + 10000 < bfuck.Length )
{
Array.Copy(bfuck, ifuck, b2fuck, 10000 );
SendFuck(b2fuck); // 将信息发送
}

Array.Copy(bfuck, ifuck, b2fuck, bfuck.Length - ifuck );
SendFuck(b2fuck); // 将最后的信息发送
pathuang68 2009-06-08
  • 打赏
  • 举报
回复
试试用C#调用openal。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧