实现这个用户回调接口来接收音频缓冲区。注册回调通过设置ILMACallback::CallbackObj2财产。这个接口有一个方法,它叫的导致音频调滤波器当过滤器接收音频缓冲区。
DirectShow的确定音频缓冲区的持续时间。然而,如果你使用LEADTOOLS多媒体工具包,您可以更改音频缓冲区188宝金博怎么下载的大小使用get_AudioBufferSize财产。
这个接口应该用于c++、。net或其他编程语言,可以给龙龙(__int64)指针。见下文为。net实例(c#和VB.NET)实现了这个接口的类。
使用ILMAUserCallback2接口使用指向数据的指针,扮演一个32位长值。使用ILMAUserCallback接口使用变体。
每次调用这个函数接收音频样本的过滤器。
pData |
指针示例数据扮演一个64位的龙龙(__int64)。示例数据是一个无符号字节数组(8位)或签署短(16位)值。这个值应该把指针无符号字节或签署短,取决于lBitsPerSample的价值。 |
lDataSize |
pData中元素的数量。如果lBitsPerSample是8,这也代表了缓冲区的大小(以字节为单位)通过pData指出。如果lBitsPerSample是16,那么pData缓冲区的大小是lDataSize * 2。 |
lBitsPerSample |
mono数据的每个抽样的比特数,决定pData指向的数据的格式。有效值是8和16。 |
lChannels |
数量的渠道(例如1 = mono, 2 =立体…) |
lSamplesPerSec |
每秒采样率,在样本。 |
lAvgBytesPerSec |
平均带宽,字节每秒。它应该等于lSamplesPerSec * lChannels * (lBitsPerSample / 8)。 |
AUDCALBK_ERR_OK |
成功。样本数据数组通过下游。 |
AUDCALBK_ERR_DROP |
把这个样品。样本数据数组不通过下游。 |
AUDCALBK_ERR_DELIVERLASTSAMPLE |
重复过去的成功交付样品。 |
其他错误代码 |
任何其他错误代码返回的过滤器。数据不通过下游。 |
音频数据的格式:
音频数据(lChannels)的一般格式如下:
样本0
通道0 |
通道1 |
- - - - - - |
通道lChannels - 1 |
在这种情况下,
pData(0)样本0,0频道
pData(1)样本0,通道1
pData (lChannels - 1)样本0,lChannels 1频道
pData (lChannels)样本1、通道0
pData (lChannels + 1)样本1,通道1
mono数据的格式很简单,因为只有一个通道。在这种情况下,数组中的每个值都是一个示例:
pData(0)样本0
pData(1)示例1
立体数据的格式仍然是简单的:每样有两个值(一个用于左通道,另一个用于正确的通道):
pData(0)样本0,左通道
pData(1)样本0,正确的通道
pData(2)样本1,左通道
pData(3)样本1,正确的通道
值的格式取决于lBitsPerChannel 8或16。
8位音频数据的格式:
数组中的值是无符号和范围在0到255之间。真正的音频价值是通过减去128从数组中值,而且应该介于-128和127之间。当改变值,记得把数据返回前增加128。
16位数据的格式:
数组中的值,范围在-32768年和32767年之间。它们包含真正的音频值。没有必要执行转换,如那些为8位数据。
例子
示例1:快速c#代码(使用不安全代码)
这个c#代码沉默的声道设置所有声音值为0。注意,这个示例使用指针,这意味着您的应用程序必须使用不安全代码编译。慢,安全代码,看看第二个例子,是用VB.NET写的。
私人无效Form1_Load (对象发送方的EventArgs e)
{
字符串文件=@“c: \ myfile.avi”;
/ /插入音频调滤波器
LTMMLib。ltmmProcessor proc = GetAudioProcessor (“领导音频调滤波器”);
playControl.SelectedAudioProcessors。添加(proc, 0);
/ /回调。
LMACallbackLib。LMACallback audioCallback = (LMACallbackLib.LMACallback) playControl.GetSubObject ((int)LTMMLib.ltmmPlay_Object.ltmmPlay_Object_SelAudioProcessor);
audioCallback。CallbackObj2 =新AudioCallback (AudioCallback);
/ /播放它。
playControl。源文件=文件;
}
公共类AudioCallback: LMACallbackLib.ILMAUserCallback3
{
不安全的公共无效CallbackProc (长pData,intlDataSize,intlBitsPerSample,intlChannels,intlSamplesPerSec,intlAvgBytesPerSec)
{
IntPtr ptrData =新IntPtr (pData);
int我;
如果(lBitsPerPixel = = 16)
{
短* ptrData16 = (短*)ptrData.ToPointer ();
为(i = 0;我< lDataSize;我+ +)
ptrData16[我]= 0;
}
其他的
{
字节* ptrData8 = (字节*)ptrData.ToPointer ();
为(i = 0;我< lDataSize;我+ +)
ptrData8[我]= 0;
}
/ /如果需要返回一个HRESULT AUDCALBK_ERR_OK以外,那么您需要抛出异常
/ /把新ReturnValueException (LMACallbackLib.AudCalBkErrConstants.AUDCALBK_ERR_XXX);
}
}
示例2:VB。NET代码(慢,但使用安全代码)
VB。NET代码沉默的声道设置所有声音的值为0。注意,这个示例是安全的,不使用指针,但低于上述不安全的代码。
公共类VBAudioCallback:实现了LMACallbackLib.ILMAUserCallback3
公共子新()
结束子
子CallbackProc (按值传递pData作为长,按值传递lDataSize作为整数,按值传递lBitsPerSample作为整数,按值传递lChannels作为整数,按值传递lSamplesPerSec作为整数,按值传递lAvgBytesPerSec作为整数)实现了LMACallbackLib.ILMAUserCallback3.CallbackProc
昏暗的ptrData作为IntPtr =新IntPtr (pData)
昏暗的我作为整数
将数据复制到一个托管数组,因为VB不支持指针。
如果lBitsPerSample = 16然后
昏暗的ptrData16 (lDataSize)作为短
复制数据从pData ptrData16
System.Runtime.InteropServices.Marshal。复制(ptrData ptrData16 0 lDataSize)
“设置数据为0
为我= 0来lDataSize - 1
ptrData16 (i) = 0
下一个
“回ptrData复制数据
System.Runtime.InteropServices.Marshal。复制(ptrData16 0 ptrData lDataSize)
其他的
昏暗的ptrData8 (lDataSize)作为字节
复制数据从pData ptrData8
System.Runtime.InteropServices.Marshal。复制(ptrData ptrData8 0 lDataSize)
“设置数据为0
为我= 0来lDataSize - 1
ptrData8 (i) = 0
下一个
“回ptrData复制数据
System.Runtime.InteropServices.Marshal。复制(ptrData8 0 ptrData lDataSize)
结束如果
结束子
结束类