ILMAUserCallback3接口

实现这个用户回调接口来接收音频缓冲区。注册回调通过设置ILMACallback::CallbackObj2财产。这个接口有一个方法,它叫的导致音频调滤波器当过滤器接收音频缓冲区。

DirectShow的确定音频缓冲区的持续时间。然而,如果你使用LEADTOOLS多媒体工具包,您可以更改音频缓冲区188宝金博怎么下载的大小使用get_AudioBufferSize财产。

这个接口应该用于c++、。net或其他编程语言,可以给龙龙(__int64)指针。见下文为。net实例(c#和VB.NET)实现了这个接口的类。

使用ILMAUserCallback2接口使用指向数据的指针,扮演一个32位长值。使用ILMAUserCallback接口使用变体。

接口方法:

HRESULT CallbackProc(龙龙pData、lDataSize长、长lBitsPerSample长lChannels lSamplesPerSec长、长lAvgBytesPerSec);

每次调用这个函数接收音频样本的过滤器。

参数

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,通道1pData (lChannels - 1)样本0,lChannels 1频道pData (lChannels)样本1、通道0pData (lChannels + 1)样本1,通道1

mono数据的格式很简单,因为只有一个通道。在这种情况下,数组中的每个值都是一个示例:

pData(0)样本0pData(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写的。

c#
私人无效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。注意,这个示例是安全的,不使用指针,但低于上述不安全的代码。

VB
公共VBAudioCallback:实现了LMACallbackLib.ILMAUserCallback3公共()结束CallbackProc (按值传递pData作为,按值传递lDataSize作为整数,按值传递lBitsPerSample作为整数,按值传递lChannels作为整数,按值传递lSamplesPerSec作为整数,按值传递lAvgBytesPerSec作为整数)实现了LMACallbackLib.ILMAUserCallback3.CallbackProc昏暗的ptrData作为IntPtr =IntPtr (pData)昏暗的作为整数将数据复制到一个托管数组,因为VB不支持指针。如果lBitsPerSample = 16然后昏暗的ptrData16 (lDataSize)作为复制数据从pData ptrData16System.Runtime.InteropServices.Marshal。复制(ptrData ptrData16 0 lDataSize)“设置数据为0我= 0lDataSize - 1ptrData16 (i) = 0下一个“回ptrData复制数据System.Runtime.InteropServices.Marshal。复制(ptrData16 0 ptrData lDataSize)其他的昏暗的ptrData8 (lDataSize)作为字节复制数据从pData ptrData8System.Runtime.InteropServices.Marshal。复制(ptrData ptrData8 0 lDataSize)“设置数据为0我= 0lDataSize - 1ptrData8 (i) = 0下一个“回ptrData复制数据System.Runtime.InteropServices.Marshal。复制(ptrData8 0 ptrData lDataSize)结束如果结束结束

LEADTOOLS过滤器C API的帮助
188金宝搏的网址客服|支持|联系我们|知识产权的通知
©1991 - 2021领先的技术公司。保留所有权利。