VB 如何判断一个程序是否有发出声音

VB 如何判断一个程序是否有发出声音,第1张

必须使用API函数,如果你不了解它或讨厌它,这会你逃不掉了。只能用API。

先弄明白什么是API,然后做几个小程序,如,获取鼠标位置。

做完后再来看你的程序。

先用findwindowex函数寻找标题为"111111"的窗口句柄(顺便把什么是句柄弄明白)。

接着,放一个TIMER,interval设为1,越短越好,用钩子或声音API时时刻刻监视。

如是,显示你那个,不是,显示F。

参数1描述要播放的声音文件的位置和文件名;参数2的取值能决定播放声音的模式。参数2的主要取值介绍如下:

取&H0时:为同步播放模式;

取&H1时:为异步播放模式;

取&H2时:当声音文件未找到就停止播音返回;

取&H8时:为循环播放模式。

当调用函数成功,就播放有关声音文件,并且函数的返回值为非0;函数调用失败,函数的返回值为0。

定义调用声音文件函数的具体步骤如下:

①在C盘根目录上建立一个名为Sound的文件夹,在此文件夹中放入5个你所需要的声音文件;

②在VB5.0状态进入“工程”菜单中的“添加模块”再选用“新建”中的“模块”;

③在模块的“通用”中输入下面代码,进行调用API函数的声明;

Declare Function sndPlaySound Lib "winmm.dll" Alias

“sndPlaySoundA" (ByV al lpszSoundName As String, ByVal uFlags As Long) As Long

Dim fil As String

④在模块中输入以下代码,定义调用声音文件函数。

Public Function sound(n As Integer) As Integer

Dim x As Integer

Select Case n

Case 1

fil = "c:\sound\beep3.wav"

x = sndPlaySound(0, 0)

x = sndPlaySound(fil, &H1 Or &H2)

sound = x

Case 2

fil = "c:\sound\hit8.wav"

x = sndPlaySound(0, 0)

x = sndPlaySound(fil, &H1 Or &H2)

sound = x

Case 3

fil = "c:\sound\net7.wav"

x = sndPlaySound(0, 0)

x = sndPlaySound(fil, &H1 Or &H2)

sound = x

Case 4

fil = "c:\sound\out12.wav"

x = sndPlaySound(0, 0)

x = sndPlaySound(fil, &H1 Or &H2)

sound = x

Case 5

fil = "c:\sound\spin5.wav"

x = sndPlaySound(0, 0)

x = sndPlaySound(fil, &H1 Or &H2)

sound = x

Case Else

sound = 0

End Select

End Function

新定义的调用声音函数格式为:sound(n),其中n的取值为1至5的正整数。利用此函数可调用5个不同的声音文件。下面是使用sound函数的演示程序:

①如图在form窗口设置6个命令控件;

②在这些命令控件的Click事件中入分别输入以下代码。

Private Sub Command1_Click()

l = sound(1)

End Sub

Private Sub Command2_Click()

l = sound(2)

End Sub

Private Sub Command3_Click()

l = sound(3)

End Sub

Private Sub Command4_Click()

l = sound(4)

End Sub

Private Sub Command5_Click()

l = sound(5)

End Sub

Private Sub Command6_Click()

End

End Sub

运行程序后,单击有关按钮就能调用所指定的声音文件,发出各种声音

c++检测车载机是否有声音输出的方法如下:

c++采集声卡输出_使用CoreAudio实现对声卡输出的捕捉。

涉及的接口有:

IMMDeviceEnumerator

IMMDevice

IAudioClient

IAudioCaptureClient

主要过程:

创建多媒体设备枚举器(IMMDeviceEnumerator)

通过多媒体设备枚举器获取声卡接口(IMMDevice)

通过声卡接口获取声卡客户端接口(IAudioClient)

通过声卡客户端接口(IAudioClient)可获取声卡输出的音频参数、初始化声卡、获取声卡输出缓冲区的大小、开启/停止对声卡输出的采集

通过声卡采集客户端接口(IAudioCaptureClient)可获取采集的声卡输出数据,并对内部缓冲区进行控制

通过声卡输出客户端接口(IAudioRenderClient)可将采集的声音数据写入声音输出设备的缓存单元,输出设备可以通过IAudioClient::GetService函数获取 IAudioRenderClient 接口。

代码示例:

//首先枚举你的音频设备,你可以在这个时候获取到你机器上所有可用的设备,并指定你需要用到的那个设备

hr = CoCreateInstance(

CLSID_MMDeviceEnumerator, NULL,

CLSCTX_ALL, IID_IMMDeviceEnumerator,

(void**)&pEnumerator)

EXIT_ON_ERROR(hr)

hr = pEnumerator->GetDefaultAudioEndpoint(

eCapture, eConsole, &pDevice)

EXIT_ON_ERROR(hr)

//创建一个管理对象,通过它可以获取到你需要的一切数据

hr = pDevice->Activate(

IID_IAudioClient, CLSCTX_ALL,

NULL, (void**)&pAudioClient)

EXIT_ON_ERROR(hr)

hr = pAudioClient->GetMixFormat(&pwfx)

EXIT_ON_ERROR(hr)

//初始化管理对象,在这里,你可以指定它的最大缓冲区长度,这个很重要,应用程序控制数据块的大小以及延时长短都靠这里的初始化,具体参数大家看看文档解释

hr = pAudioClient->Initialize(

AUDCLNT_SHAREMODE_SHARED,

0,

hnsRequestedDuration,

0,

pwfx,

NULL)

EXIT_ON_ERROR(hr)

//这个buffersize,指的是缓冲区最多可以存放多少帧的数据量

hr = pAudioClient->GetBufferSize(&bufferFrameCount)

EXIT_ON_ERROR(hr)

//创建采集管理接口,这个接口很简单,没什么重要的东西

hr = pAudioClient->GetService(

IID_IAudioCaptureClient,

(void**)&pCaptureClient)

EXIT_ON_ERROR(hr)

// Notify the audio sink which format to use.

hr = pMySink->SetFormat(pwfx)

EXIT_ON_ERROR(hr)

// Calculate the actual duration of the allocated buffer.

hnsActualDuration = (double)REFTIMES_PER_SEC *

bufferFrameCount / pwfx->nSamplesPerSec

hr = pAudioClient->Start()// Start recording.

EXIT_ON_ERROR(hr)

// Each loop fills about half of the shared buffer.

while(bDone == FALSE)

{

//让程序暂停运行一段时间,缓冲区里在这段时间会被填充数据

Sleep(hnsActualDuration/REFTIMES_PER_MILLISEC/2)

hr = pCaptureClient->GetNextPacketSize(&packetLength)

EXIT_ON_ERROR(hr)

while(packetLength != 0)

{

//锁定缓冲区,获取数据

hr = pCaptureClient->GetBuffer(

&pData,

&numFramesAvailable,

&flags, NULL, NULL)

EXIT_ON_ERROR(hr)

if(flags &AUDCLNT_BUFFERFLAGS_SILENT)

{

pData = NULL

}

hr = pMySink->CopyData(

pData, numFramesAvailable, &bDone)

EXIT_ON_ERROR(hr)

hr = pCaptureClient->ReleaseBuffer(numFramesAvailable)

EXIT_ON_ERROR(hr)

hr = pCaptureClient->GetNextPacketSize(&packetLength)

EXIT_ON_ERROR(hr)

}

}

hr = pAudioClient->Stop()

EXIT_ON_ERROR(hr)

查看录制的音频可以用 audacity 这个软件


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11997341.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存