从mic录音程序如何做?

Anakin_Skywalker 2003-09-23 03:02:07

现在不想要完整的录音程序,只需要读取当前mic接收到的声音的波形数值就可以了,应该如何做?
...全文
56 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
EricTangHL 2003-10-11
  • 打赏
  • 举报
回复
mark
Anakin_Skywalker 2003-09-25
  • 打赏
  • 举报
回复

在vb6中能通过了,但是我不知道得到的数据格式是如何的
假如:
With dscbd.fxFormat
.nFormatTag = DxVBLibA.CONST_WAVEFORMATFLAGS.WAVE_FORMAT_1M08
.nChannels = 1
.lSamplesPerSec = 22050
.nBitsPerSample = 16
.nBlockAlign = .nBitsPerSample / 8 * .nChannels
.lAvgBytesPerSec = .lSamplesPerSec * .nBlockAlign
.nSize = 0 ' Ignored for WAVE_FORMAT_PCM.
End With

那么得到的dataBuf需要多长?几个databuf元素代表一个样点的绝对值?
sayo 2003-09-24
  • 打赏
  • 举报
回复
使用DirectSoundCapture

使用streaming buffer可减少buffer的使用量
Anakin_Skywalker 2003-09-24
  • 打赏
  • 举报
回复

对的!

现在就是说不需要一个大的buffer,而要一个能够时时更新的小buffer,最好只有一帧,不需要绘wave图,不需要存文件

需要能够在需要时立即更新该帧,速度要快,满足连续读取需要

另外,从buffer读出录音的声音强度是否是一个可正可负的浮点值?就是wave图上的点?
Anakin_Skywalker 2003-09-24
  • 打赏
  • 举报
回复
我用VB.NET是这样做的:

Dim dx As New DirectX8
Dim dsc As DirectSoundCapture8
Dim dscbd As DSCBUFFERDESC
Dim dscb As DirectSoundCaptureBuffer8
Dim dataBuf() As IntPtr

dsc = dx.DirectSoundCaptureCreate(vbNullString)

' Set up the wave format.
With dscbd.fxFormat
.nFormatTag = DxVBLibA.CONST_WAVEFORMATFLAGS.WAVE_FORMAT_1M08
.nChannels = 1 '通道数
.lSamplesPerSec = 22050 '采样率
.nBitsPerSample = 16 '16位
.nBlockAlign = .nBitsPerSample / 8 * .nChannels '字节数
.lAvgBytesPerSec = .lSamplesPerSec * .nBlockAlign '每秒字节数
.nSize = 0 ' Ignored for WAVE_FORMAT_PCM.
End With
dscbd.lFlags = DxVBLibA.CONST_DSCBCAPSFLAGS.DSCBCAPS_DEFAULT
dscbd.lBufferBytes = dscbd.fxFormat.lAvgBytesPerSec * 10 '一秒长
'dscbd.lBufferBytes = 4 '一字节长
dscb = dsc.CreateCaptureBuffer(dscbd)

dscb.Start(CONST_DSCBSTARTFLAGS.DSCBSTART_DEFAULT) '开始,不重绕

Dim dataBuf() As IntPtr

ReDim dataBuf(4 - 1)

dscb.ReadBuffer(0, 1, dataBuf(0), CONST_DSCBLOCKFLAGS.DSCBLOCK_DEFAULT)

'编译通过,运性时最后一句出错,说引用了错误指针。我想知道为什么

本来directX8中的dscb.ReadBuffer的第三各参数是一个int型的buffer数组,但在.NET中就变成了中间类型IntPtr,我怀疑是这里的问题,是不是在vb6中会好呢?
awapopeye 2003-09-24
  • 打赏
  • 举报
回复
8位PCM是这样的。但是其他采样率下的格式就不是了。

如果你的BUFFER就只有一帧的话肯定不行。建议建立2个小的BUFFER,每个可以在2到4帧之间。这样保险点。就算有延时也是MS级别,可以忽略。
awapopeye 2003-09-24
  • 打赏
  • 举报
回复
设备端录音是有BUFFER的,你的要求其实就是,在BUFFER被填充的同时,还要要求填充BUFFER的音频数据再次被读取?

对吗?
Anakin_Skywalker 2003-09-23
  • 打赏
  • 举报
回复
最好用.NET,不需要写文件,只要能够读取当前buffer的首个值就可以了

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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