public class AudioGroup
extends Object
java.lang.Object | |
↳ | android.net.rtp.AudioGroup |
AudioGroup是扬声器,麦克风和AudioStream
的音频集线器。 通过调用setMode(int)
或setMode(int)
可以在逻辑上打开或关闭这些组件中的每个组件。 AudioGroup将遍历这些组件并在其执行循环内逐个处理它们。 该循环由四个步骤组成。 首先,对于不在MODE_SEND_ONLY
每个AudioStream,解码其传入数据包并存储在其缓冲区中。 然后,如果麦克风已启用,则处理录制的音频并存储在其缓冲区中。 第三,如果扬声器已启用,则混合所有AudioStream缓冲区并播放。 最后,对于不在MODE_RECEIVE_ONLY
每个AudioStream,混合所有其他缓冲区MODE_RECEIVE_ONLY
回编码后的数据包。 如果AudioGroup中没有AudioStream,AudioGroup将不执行任何操作。
在使用这些类之前,一些事情必须注意。 性能与系统负载和网络带宽密切相关。 通常更简单的AudioCodec
的CPU周期更少,但需要更多的网络带宽,反之亦然。 同时使用两个AudioStreams不仅可以使负载加倍,还可以使带宽增加一倍。 条件因设备而异,开发人员应该选择合适的组合以获得最佳结果。
在同一时间保持多个AudioGroup有时很有用。 例如,IP语音(VoIP)应用程序可能想要暂停电话会议,以便进行新呼叫,但仍允许电话会议中的人员相互通话。 这可以使用两个AudioGroups轻松完成,但有一些限制。 由于扬声器和麦克风是全球共享资源,因此一次只允许一个AudioGroup以MODE_ON_HOLD
以外的模式运行。 其他人将无法获得这些资源并且无声无息地失败。
使用此类需要RECORD_AUDIO
权限。 开发人员应该设置音频模式为MODE_IN_COMMUNICATION
使用setMode(int)
,并改变它回来的时候没有AudioGroups的正在使用中。
也可以看看:
Constants |
|
---|---|
int |
MODE_ECHO_SUPPRESSION 该模式类似于 |
int |
MODE_MUTED 此模式与 |
int |
MODE_NORMAL 此模式表示组中的扬声器,麦克风和所有 |
int |
MODE_ON_HOLD 此模式与 |
Public constructors |
|
---|---|
AudioGroup() 创建一个空的AudioGroup。 |
Public methods |
|
---|---|
void |
clear() 删除该组中的每个 |
int |
getMode() 返回当前模式。 |
AudioStream[] |
getStreams() 返回此组中的 |
void |
sendDtmf(int event) 向该组中的每个 |
void |
setMode(int mode) 改变当前模式。 |
Protected methods |
|
---|---|
void |
finalize() 当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
int MODE_ECHO_SUPPRESSION
该模式类似于MODE_NORMAL
除了回声抑制已启用。 它只能在扬声器电话打开时使用。
常量值:3(0x00000003)
int MODE_NORMAL
此模式表示组中的扬声器,麦克风和所有AudioStream
已启用。 首先,从流接收到的数据包被解码并与麦克风记录的音频混合。 然后,将结果回放给发言者,编码并发送回每个流。
常量值:2(0x00000002)
int MODE_ON_HOLD
此模式与 MODE_NORMAL
类似,只是扬声器和麦克风均被禁用。
常量值:0(0x00000000)
AudioStream[] getStreams ()
返回此组中的 AudioStream
。
Returns | |
---|---|
AudioStream[] |
void sendDtmf (int event)
向该组中的每个AudioStream
发送一个DTMF数字。 目前仅支持事件0
至15
。
Parameters | |
---|---|
event |
int
|
Throws | |
---|---|
IllegalArgumentException |
if the event is invalid. |
void setMode (int mode)
改变当前模式。 它必须是一个MODE_ON_HOLD
, MODE_MUTED
, MODE_NORMAL
,并MODE_ECHO_SUPPRESSION
。
Parameters | |
---|---|
mode |
int : The mode to change to. |
Throws | |
---|---|
IllegalArgumentException |
if the mode is invalid. |
void finalize ()
当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 一个子类重写finalize
方法来处置系统资源或执行其他清理。
的常规协定finalize
是,它被调用,如果当在Java TM虚拟机已确定不再有由该目的可以通过还没有死亡,除了作为一个动作的结果的任何线程访问的任何手段取决于某些其他可以完成的对象或类别的最终定稿。 finalize
方法可以采取任何行动,包括使这个对象再次可用于其他线程; 然而, finalize
的通常目的是在对象被不可撤销地丢弃之前执行清理操作。 例如,表示输入/输出连接的对象的finalize方法可能会执行显式I / O事务,以在永久丢弃该对象之前中断连接。
类Object
的finalize
方法Object
执行特殊操作; 它只是正常返回。 Object
子类可能会覆盖此定义。
Java编程语言不保证哪个线程将为任何给定的对象调用finalize
方法。 但是,保证调用finalize的线程在调用finalize时不会保留任何用户可见的同步锁。 如果finalize方法引发未捕获的异常,则忽略该异常,并终止该对象的终止。
在为对象调用 finalize
方法之后,不会采取进一步的操作,直到Java虚拟机再次确定不再有任何途径可以通过任何尚未死亡的线程访问此对象,包括可能的操作通过准备完成的其他对象或类别,此时该对象可能被丢弃。
对于任何给定对象,Java虚拟机永远不会多次调用 finalize
方法。
由 finalize
方法引发的任何异常 finalize
导致此对象的终止被暂停,但在其他情况下会被忽略。
Throws | |
---|---|
Throwable |