6. 媒体(Media)

媒体对象是能够产生媒体或接受媒体的对象。

Media的重要子类是AudioMedia,它代表音频媒体。PJSUA2支持多种类型的音频媒体对象:

  • 捕获设备的AudioMedia,用于从声音设备捕获音频。
  • 播放设备的AudioMedia,可以播放音频到声音设备。
  • 呼叫音频媒体,用于向远程人员发送和接收音频。
  • AudioMediaPlayer,播放WAV文件。
  • AudioMediaRecorder将音频录制到WAV文件。

将来可能会添加更多的媒体对象。

6.1 音频会议桥

会议桥提供了一种简单而又强大的概念来管理音频媒体之间的音频流。原理很简单,就是将音频源连接到音频目的地,桥接器会把音频流从源地址送到目的地,就这样。如果多个来源正在发送到同一个目的地,则来自源的音频被混合。如果一个信号源发送到多个目的地,则桥接器负责把来自源的音频复制到多个目的地。桥接器甚至会照顾不同时钟频率和时间的媒体。

在PJSUA2中,所有音频媒体对象都插入中央会议桥,方便操作。首先,插入式音频媒体将不会连接到任何东西,因此媒体不会流出/入任何对象。音频媒体源可以使用API​​ AudioMedia.startTransmit()/ AudioMedia.stopTransmit())启动/停止到目的地的传输。

插入式的会议桥的音频媒体对象将被赋予识别桥对象的端口ID号。 应用程序可以使用API AudioMedia.getPortId()来检索端口ID。 通常,应用程序不需要担心会议桥及其端口ID(所有这些都将由Media类负责),除非应用程序要创建自己的定制音频媒体。

6.1.1 播放WAV文件

要将WAV文件播放到声音设备,只需将WAV播放对象传输到声音设备的播放媒体:

AudioMediaPlayer player;
AudioMedia& play_med = Endpoint::instance().audDevManager().getPlaybackDevMedia();
try
{
player.createPlayer("file.wav");
player.startTransmit(play_med);
}
catch(Error& err)
{
}

默认情况下,WAV文件将以循环模式播放。要禁用循环,创建播放器时,需指定 PJMEDIA_FILE_NO_LOOP

player.createPlayer("file.wav", PJMEDIA_FILE_NO_LOOP);

没有循环,一旦回放到达WAV文件的末尾,就会播放静音。

完成播放后,只需停止播放即可停止播放:

try
{
player.stopTransmit(play_med);
}
catch(Error& err)
{
}

在停止播放时,将从上次播放位置恢复播放,恢复传输。使用player.setPos()到播放位置,设定到所需的位置。

6.1.2 录制为WAV文件

如果要将音频设备录制到WAV文件,只需执行以下操作:

AudioMediaRecorder recorder;
AudioMedia& cap_med = Endpoint::instance().audDevManager().getCaptureDevMedia();
try {
recorder.createRecorder("file.wav");
cap_med.startTransmit(recorder);
} catch(Error& err) {
}

媒体将从声音设备流向WAV录像文件。像前面一样,要停止或暂停录制,只需停止传输:

try {
cap_med.stopTransmit(recorder);
} catch(Error& err) {
}

请注意,如上所述停止向WAV录像机的传输并不会关闭WAV文件,可通过将源连接到WAV录像机来重新开始录制。关闭之前无法播放录制的WAV文件。要关闭WAV录音机,只需删除它:

delete recorder;

6.1.3 本地音频环回

通过将捕获设备中的音频直接发送到播放设备(即本地环回),检查本地声音设备(捕获和播放设备)是否正常工作的有用测试。可以这样做:

cap_med.startTransmit(play_med);

6.1.4 循环音频

如果需要,可以将音频媒体对象的音频循环到自身(即,从对象接收的音频将被传输到自身)。只要对象具有双向介质,就可以从任何对象中回放音频。这意味着可以循环呼叫音频媒体,以便远程人员收到的音频将被传回给他/他。但是不能循环WAV播放器或录音机,因为这些对象只能播放或录制,而不能同时播放和录制。

6.1.5 正常呼叫

单个呼叫可以有多个媒体(例如音频和视频)。应用程序可以使用API​​ Call.getMedia()检索音频媒体。然后,对于正常的呼叫,我们想要与远程人员建立双向音频,可以通过连接声音设备和呼叫音频媒体轻松完成,反之亦然:

CallInfo ci = call.getInfo();
AudioMedia *aud_med = NULL; // Find out which media index is the audio
for (unsigned i=; i<ci.media.size(); ++i) {
if (ci.media[i].type == PJMEDIA_TYPE_AUDIO) {
aud_med = (AudioMedia *)call.getMedia(i);
break;
}
} if (aud_med) {
// This will connect the sound device/mic to the call audio media
cap_med.startTransmit(*aud_med); // And this will connect the call audio media to the sound device/speaker
aud_med->startTransmit(play_med);
}

6.1.6 第二通电话

假设我们想同时与两个伙伴谈话。由于我们已经与一方进行双向媒体连接,我们只需要使用以下代码向对方添加双向连接:

AudioMedia *aud_med2 = (AudioMedia *)call2.getMedia(aud_idx);
if (aud_med2) {
cap_med->startTransmit(*aud_med2);
aud_med2->startTransmit(play_med);
}

现在我们可以同时与双方交谈,我们会听到任何一方的声音。但是在这个阶段,远程方不能说话或者听不到对方(即我们还没有在全会议模式下)。

6.1.7 电话会议

为了让双方互相交流,只需建立双向媒体:

aud_med->startTransmit(*aud_med2);
aud_med2->startTransmit(*aud_med);

现在三方(我们和这两个伙伴)都能够相互交流。

6.1.8 录制会议

在进行会议时,想要将会议记录到WAV文件是非常有意义的,我们需要做的就是将麦克风和两个通话连接到WAV录音机:

cap_med.startTransmit(recorder);
aud_med->startTransmit(recorder);
aud_med2->startTransmit(recorder);

6.2 音频设备管理

请参阅接下来的音频设备框架

6.3 类参考

6.3.1 媒体框架

class

class pj::Media

class pj::Media

媒体

PJ :: AudioMedia子类化

公有函数

1)Virtual ~Media()

虚拟析构函数

2)pjmedia_type getType() const

获取媒体类型。

返回

媒体类型。

Class pj::AudioMedia

音频媒体

PJ ::Media继承

子类PJ :: AudioMediaPlayerPJ :: AudioMediaRecorderPJ :: ToneGenerator

公有函数

3)ConfPortInfogetPortInfo() const

获取有关指定会议端口的信息。

4)INT getPortId() const

获取端口ID。

5)void startTransmit(const  AudioMediasink) const

建立单向媒体流(下沉)。

该媒体端口将作为源,它可以传输到多个目的地/汇。并且如果多个源传输到同一个接收器,则媒体将被混合在一起。源和接收器可以指同一媒体,有效地循环播放媒体。

如果需要双向媒体流,应用程序需调用此方法两次,第二个来自相对的源媒体。

参数sink -目标媒体

6)void stopTransmit(const  AudioMediasink) const

停止媒体流到目的地/汇聚端口。

参数sink -目的地媒体。

7)void adjustRxLevel (float level) 通过调整从媒体桥传输到介质端口的信号电平,使其更大或安静,。

参数  level - 信号电平调整。值1.0表示无电平调整,值0表示使端口静音。

8)void adjustTxLevel(float level)

通过调整从该媒体端口(到桥接器)接收的信号电平,使其更大或更安静

参数level -信号电平调整。值1.0表示无电平调整,值0表示使端口静音。

9)unsigned getRxLevel() const

获取最后收到的信号电平。

返回信号电平百分比。

10)unsigned getTxLevel() const

获取最后传输的信号电平。

返回信号电平百分比。

11)Virtual ~AudioMedia()

虚拟析构函数

公共静态功能

12)static  ConfPortInfogetPortInfoFromId( INT port_id 

从特定端口ID获取信息。

13)static  AudioMedia * typecastFromMedia(媒体 * 媒体

从基类媒体的类型转换。

这对于不支持向下转换的语言诸如Python编写的应用程序很有用。

返回 对象为AudioMedia实例

参数media -要被对待的对象

Class pj::AudioMediaPlayer

音频媒体播放器。

继承PJ :: AudioMedia

公有函数

14)AudioMediaPlayer()

构造函数

15)void createPlayer(const string &file_name, unsigned options = 0)

创建文件播放器,并自动将此播放器添加到会议桥。

参数file_name -要播放的文件名。目前仅支持WAV文件,WAV文件必须格式化为16bit PCM单声道/单声道(支持任何时钟频率)。

  • options -可选选项标志。应用程序可以指定PJMEDIA_FILE_NO_LOOP以防止回放循环。

16)void createPlaylist(const StringVector &file_namesconst string &label = "", unsigned options = 0)

创建文件播放列表媒体端口,并自动将端口添加到会议桥。

参数

  • file_names -要添加到播放列表的文件名数组。请注意,文件必须具有相同的时钟速率,通道数和每个样本的位数。
  • label -要为媒体端口设置的可选标签。
  • options -可选选项标志。应用程序可以指定PJMEDIA_FILE_NO_LOOP以防止循环。

17)AudioMediaPlayerInfogetInfo() const

获取有关播放器的其他信息。

此操作仅适用于播放器。对于播放列表,将抛出错误

返回对应信息

18)pj_uint32_t getPos() const

获取当前播放位置。

此操作对播放列表无效。

返回当前播放位置

19)void setPos( pj_uint32_t samples

samples中设置播放位置。

此操作对播放列表无效。

参数

  • samples -样品中所需的播放位置。

20)Virtual ~AudioMediaPlayer()

析构器

21)Virtual bool onEof()

当文件播放器读取到文件结束或读取到达播放列表的最后一个文件结束时,注册要调用的回调。如果文件或播放列表设置为重复播放,则将多次调用回调。

返回如果回调返回false,则播放将停止。注意,如果应用程序在回调中破坏播放器,则必须在此返回false。

公共静态功能

22)static  AudioMediaPlayer * typecastFromAudioMedia(AudioMedia * media

从基类AudioMedia的类型转换。

这对于不支持向下转换的语言诸如Python编写的应用程序很有用

返回

AudioMediaPlayer对象实例

参数

  • media -要被转换的对象

class pj::AudioMediaRecorder

音频媒体记录器。

继承PJ :: AudioMedia

公有函数

23)AudioMediaRecorder()

构造函数

24)void createRecorder(const string &file_name, unsigned enc_type = 0, pj_ssize_t max_size = 0, unsigned options = 0)

创建文件记录器,并自动将此录音机连接到会议桥。录音机目前支持录制WAV文件。要使用的录像机的类型由文件的扩展名(例如“.wav”)决定。

参数

  • file_name -输出文件名。该功能将根据文件扩展名确定要使用的默认格式。目前所有平台都支持“.wav”。
  • enc_type -如果文件可以支持不同的编码,可选择用于压缩介质的编码器类型。现在该值必须为零。
  • max_size -最大文件大小。 指定零或-1以删除大小限制。此值现在必须为零或-1。
  • options -可选选项,可用于指定录制文件格式。支持的选项有PJMEDIA_FILE_WRITE_PCM,PJMEDIA_FILE_WRITE_ALAW和PJMEDIA_FILE_WRITE_ULAW。默认值为零或PJMEDIA_FILE_WRITE_PCM。

25)Virtual ~AudioMediaRecorder()

析构器

公共静态功能

26)static  AudioMediaRecorder * typecastFromAudioMedia(AudioMedia * media

AudioMedia类的类型转换。

这对于不支持向下转换的语言诸如Python编写的应用程序很有用

返回AudioMediaRecorder对象实例

参数

media -要被转换的对象

格式和信息

27)struct pj::MediaFormat

此结构包含完全描述媒体所需的所有信息。

子类PJ :: MediaFormatAudioPJ :: MediaFormatVideo

28)struct pj::MediaFormatAudio

该结构描述了有关音频媒体的详细信息。

继承PJ :: MediaFormat

29)struct pj::MediaFormatVideo

该结构描述了有关视频媒体的详细信息。

继承PJ :: MediaFormat

30)struct pj::ConfPortInfo

此结构描述了已注册到会议桥中的特定媒体端口的信息。

6.3.2 音频设备框架

设备管理器

class pj::AudDevManager

音频设备管理器

公有函数

31)INT getCaptureDev() const

获取当前活动的捕捉声音设备。

如果没有创建声音设备,则该功能可能返回-1作为设备ID。

返回捕获设备的设备ID。

32)AudioMedia&getCaptureDevMedia()

获取AudioMedia捕获音频设备。

返回用于捕获设备的音频媒体。

33)INT getPlaybackDev() const

获取当前正在播放的声音设备。

如果没有创建声音设备,则该功能可能返回-1作为设备ID。

返回播放设备的设备ID。

34)AudioMedia&getPlaybackDevMedia()

获取AudioMedia扬声器/播放音频设备。

返回扬声器/播放设备的音频媒体。

35)void setCaptureDev( INT capture_dev ) const

选择或更改采集(捕获)声音的设备。

应用程序可以随时调用此功能来替换当前的声音设备。调用此方法不会更改声音设备的状态(打开/关闭)。注意,此方法将覆盖设定的模式()setSndDevMode

参数

  • capture_dev -捕获设备的设备ID。

36)void setPlaybackDev( INT playback_dev ) const

选择或更改播放声音设备

应用程序可以随时调用此功能来替换当前的声音设备。调用此方法不会更改声音设备的状态(打开/关闭)。注意,此方法将覆盖设定的模式()setSndDevMode

参数

  • playback_dev -播放设备的设备ID。

37)const AudioDevInfoVector&enumDev()

枚举系统中安装的所有音频设备。

返回

音频设备信息列表。

38)void setNullDev()

设置pjsua使用空声音设备。

零声音设备仅提供会议桥所需的时间,并且不会与任何硬件相互冲突。

39)MediaPort * setNoDev()

断开主会议桥与任何声音设备的连接,并让应用将网桥连接到自己的声卡/主端口。

返回

会议桥的端口接口,使应用程序可以将其连接到自己的声音设备或主端口。

40)void setSndDevMode(unsigned mode) const

设置声音设备模式。

参数

  • mode -声音设备模式,作为#pjsua_snd_dev_mode的位掩码组合

41)void setEcOptions(unsigned tail_msec, unsigned options)

更改回声消除设置。此功能的行为取决于声音设备当前是否处于活动状态,如果是,该设备或软件是否支持AEC。

如果声音设备当前处于活动状态,并且设备支持AEC,则此功能会将更改请求转发给设备,并且由设备决定是否支持该请求。如果使用软件AEC(如果设备不支持AEC,将使用软件EC),则此功能将更改软件EC设置。在所有情况下,将保存设置以备将来打开声音设备。

如果当前声音设备未处于活动状态,则仅会更改默认的AEC设置,并且下次打开声音设备时将进行设置。

参数

  • tail_msec -尾长度,以毫秒为单位。设置为零以禁用AEC。
  • options -要传递给pjmedia_echo_create()的选项。通常值应为零。

42)unsigned getEcTail() const

获取当前的回声消除器尾部长度。

返回

EC尾部长度(以毫秒为单位),如果禁用AEC,则该值将为零。

43)bool sndIsActive() const

检查声音设备当前是否处于活动状态。

非活动状态的情况:

应用程序已经设置自动关闭功能(在sndAutoCloseTime设定声音设备可以是不活动MediaConfig

无声音设备

声音设备已经经由配置setNoDev()函数。

44)void refreshDevs()

刷新系统中安装的声音设备列表。

此方法只会刷新音频设备列表,因此所有活动音频流将不受影响。刷新设备列表后,在调用任何接受音频设备索引方法作为参数之前,应用程序必须确保更新对音频设备所有索引的更新。

45)unsigned getDevCount() const

获取系统中安装的声音设备的数量。

返回

安装在系统中的声音设备的数量。

46)AudioDevInfogetDevInfo( INT ID ) const

获取设备信息。

返回一旦返回成功,将通过此方法填写的设备信息。

参数

  • id -音频设备ID。

47)int lookupDev(const string &drv_nameconst string &dev_name) const

根据驱动和设备名称查找设备索引。

返回设备ID。如果未找到该设备,抛出错误

参数

  • drv_name –驱动名称。
  • dev_name -设备名称。

48)string capName(pjmedia_aud_dev_cap cap) const

获取指定功能的字符串信息。

返回Capability 名称

参数

  • cap -Capability ID。

49)void setExtFormat(const MediaFormatAudio &format, bool keep = true)

配置音频格式(PCM除外)到正在使用的声音设备。

如果声音设备当前处于活动状态,则该方法会将设置转发到要立即应用的声音设备实例(如果它支持)。

此方法仅在设备具备AudioDevInfo.caps标志的PJMEDIA_AUD_DEV_CAP_EXT_FORMAT能力时才起作用。否则抛出错误

注意,如果设置保留将来使用,即使应用程序更改了要使用的声音设备,也将应用于任何设备。

参数

  • format - 音频格式。
  • keep -指定设置是否保留以备将来使用。

50)MediaFormatAudiogetExtFormat() const

获取正在使用的声音设备的音频格式功能(PCM除外)。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

此方法仅在设备标志AudioDevInfo.caps 的PJMEDIA_AUD_DEV_CAP_EXT_FORMAT时有效,否则抛出错误

返回

音频格式。

51)void setInputLatency(unsigned latency_msec, bool keep = true)

为正在使用的声音设备配置音频输入延迟控制或查询功能。

如果声音设备当前处于活动状态,则该方法会将设置转发到要立即应用的声音设备实例(如果它支持)。

仅在设备具有PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY标志位(AudioDevInfo.caps标志)时,此方法有效,否则抛出错误

请注意,如果设置保留将来使用,即使应用程序更改了要使用的声音设备,也将应用于任何设备。

参数

  • latency_msec -输入延迟。
  • keep -指定设置是否保留以备将来使用。

52)unsigned getInputLatency() const

获取正在使用的声音设备的音频输入延迟控制或查询功能。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

此方法仅在设备具有PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY能力时有效(在AudioDevInfo.caps标志中),否则抛出错误

返回

音频输入延迟。

53)void setOutputLatency(unsigned latency_msec, bool keep = true)

为正在使用的声音设备配置音频输出延迟控制或查询功能。

如果声音设备当前处于活动状态,则该方法会将设置转发到要立即应用的声音设备实例(如果它支持)。

此方法仅在设备的AudioDevInfo.caps标志中包含PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY时有效,否则抛出错误

请注意,如果设置保留将来使用,即使应用程序更改了要使用的声音设备,也将应用于任何设备。

参数

  • latency_msec -输出延迟。
  • keep -指定设置是否保留以备将来使用。

54)unsigned getOutputLatency() const

获取正在使用的声音设备的音频输出延迟控制或查询功能。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

此方法仅在设备的AudioDevInfo.caps标志中包含PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY时有效,否则抛出错误

返回

音频输出延迟。

55)void setInputVolume(unsigned volume, bool keep = true)

为正在使用的声音设备配置音频输入音量级别。

如果声音设备当前处于活动状态,则该方法会将设置转发到要立即应用的声音设备实例(如果它支持)。

此方法仅在设备具有PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING能力时有效(在AudioDevInfo.caps标志中),否则抛出错误

请注意,如果设置保留将来使用,即使应用程序更改了要使用的声音设备,也将应用于任何设备。

参数

  • volume -输入音量级别,以百分比表示。
  • keep -指定设置是否保留以备将来使用。

56)unsigned getInputVolume() const

获取正在使用的声音设备的音频输入音量电平能力。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

此方法仅在设备具有PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING能力时有效(在AudioDevInfo.caps标志中),否则抛出错误

返回

音频输入音量级别,以百分比表示。

57)void setOutputVolume(unsigned volume, bool keep = true)

为正在使用的声音设备配置音频输出音量级别。

如果声音设备当前处于活动状态,则该方法会将设置转发到要立即应用的声音设备实例(如果它支持)。

此方法仅在设备具有PJMEDIA_AUD_DEV_CAP_OUTPUT _VOLUME_SETTING能力时有效(在AudioDevInfo.caps标志中),否则抛出错误

请注意,如果设置保留将来使用,即使应用程序更改了要使用的声音设备,也将应用于任何设备。

参数

  • volume -输出音量级别,以百分比表示。
  • keep -指定设置是否保留以备将来使用。

58)unsigned getOutputVolume() const

获取正在使用的声音设备的音频输出音量级别功能。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

此方法仅在设备具有PJMEDIA_AUD_DEV_CAP_OUTPUT _VOLUME_SETTING能力时有效(在AudioDevInfo.caps标志中),否则抛出错误

返回

音频输出音量级别,以百分比表示。

59)unsigned getInputSignal() const

获取正在使用的声音设备的音频输入信号电平能力。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

此方法仅在设备具有PJMEDIA_AUD_DEV_CAP_INPUT_SIGNAL_METER能力时有效(在AudioDevInfo.caps标志中),否则抛出错误

返回

音频输入信号电平,以百分比表示。

60)unsigned getOutputSignal() const

获取正在使用的声音设备的音频输出信号电平能力。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

此方法仅在设备具有PJMEDIA_AUD_DEV_CAP_OUTPUT_SIGNAL_METER能力时有效(在AudioDevInfo.caps标志中),否则抛出错误

返回

音频输出信号电平,以百分比表示。

61)void setInputRoute(pjmedia_aud_dev_route route, bool keep = true)

这将为正在使用的声音设备配置音频输入路由功能。

如果声音设备当前处于活动状态,则该方法会将设置转发到要立即应用的声音设备实例(如果它支持)。

此方法仅在PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE AudioDevInfo.caps标志时有效,否则错误

请注意,如果设置保留将来使用,即使应用程序更改了要使用的声音设备,也将应用于任何设备。

参数

  • route -音频输入路由。
  • keep -指定设置是否保留以备将来使用。

62)pjmedia_aud_dev_route getInputRoute() const

获取正在使用的声音设备的音频输入路由功能。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

仅在有PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE标识时有效有效(AudioDevInfo.caps标志),否则错误

返回

音频输入路由。

63)void setOutputRoute(pjmedia_aud_dev_route route, bool keep = true)

这将对正在使用的声音设备配置音频输出路由功能。

如果声音设备当前处于活动状态,则该方法会将设置转发到要立即应用的声音设备实例(如果它支持)。

此方法仅在具有PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE标识时有效(AudioDevInfo.caps标志),否则抛出错误

请注意,如果设置保留将来使用,即使应用程序更改了要使用的声音设备,也将应用于任何设备。

参数

route -音频输出路由。

keep -指定设置是否保留以备将来使用。

64)pjmedia_aud_dev_route getOutputRoute() const

获取正在使用的声音设备的音频输出路由。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

此方法仅在设备有PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE能力时有效(AudioDevInfo.caps标志),否则抛出错误

返回

音频输出路由。

65)void setVad(bool enable, bool keep = true)

对正在使用的声音设备,设置音频语音活动检测能力。

如果声音设备当前处于活动状态,则该方法会将设置转发到要立即应用的声音设备实例(如果它支持)。

此方法仅在设备有PJMEDIA_AUD_DEV_CAP_VAD能力时起作用(AudioDevInfo.caps标志),否则抛出错误

请注意,如果设置保留将来使用,即使应用程序更改了要使用的声音设备,也将应用于所有设备。

参数

enable -启用/禁用语音活动检测功能。设置为true以启用。

keep -指定设置是否保留以备将来使用。

66)bool getVad() const

获取正在使用的声音设备的音频声音活动检测功能。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

此方法仅在设备有PJMEDIA_AUD_DEV_CAP_VAD能力时起作用(AudioDevInfo.caps标志),否则抛出错误

返回

音频声音活动检测功能。

67)void setCng(bool enable, bool keep = true)

这将为正在使用的声音设备配置舒适噪声生成的(comfort noise generation)能力。

如果声音设备当前处于活动状态,则该方法会将设置转发到要立即应用的声音设备实例(如果它支持)。

具有AudioDevInfo.caps的PJMEDIA_AUD_DEV_CAP_CNG 标志时有效,否则抛出错误

请注意,如果设置保留将来使用,即使应用程序更改了要使用的声音设备,也将应用于任何设备。

参数

enable -启用/禁用舒适噪声生成的能力。设置为true以启用。

keep -指定设置是否保留以备将来使用。

68)bool getCng() const

获取正在使用的声音设备的音频降噪(comfort noise generation)能力。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

具有AudioDevInfo.caps的PJMEDIA_AUD_DEV_CAP_CNG 标志时有效,否则抛出错误

返回

是否具备音频舒适噪声生成的功能。

69)void setPlc(bool enable, bool keep = true)

为正在使用的声音设备配置音频包丢失隐藏(packet loss concealment )功能。

如果声音设备当前处于活动状态,则该方法会将设置转发到要立即应用的声音设备实例(如果它支持)。

此方法仅在PJMEDIA_AUD_DEV_CAP_PLC配置时有效(AudioDevInfo.caps标志中),否则抛出错误

请注意,如果设置保留将来使用,即使应用程序更改了要使用的声音设备,也将应用于任何设备。

参数

  • enable -启用/禁用丢包隐藏功能。设置为true以启用。
  • keep -指定设置是否保留以备将来使用。

70)bool getPlc() const

获取正在使用的声音设备的音频包丢失隐藏功能。

如果声音设备当前处于活动状态,则该方法会将该请求转发到声音设备。如果声音设备当前处于非活动状态,并且如果应用程序以前设置了设置并将设置标记为保留,则该设置将被返回。否则,这种方法会引起错误。

设备需具备PJMEDIA_AUD_DEV_CAP_PLC能力,才能起作用(AudioDevInfo.caps标志),否否则抛出错误

返回

音频丢包隐藏功能。

设备信息

71)struct pj::AudioDevInfo

音频设备信息结构。

PJSUA2开发文档--第六章 媒体 Media类的更多相关文章

  1. PJSUA2开发文档--第七章 呼叫 Calls类

    7   呼叫Calls 呼叫由Call类处理 7.1 子类化Call类 要使用Call类,应用程序应创建子类,如: class MyCall : public Call { public: MyCal ...

  2. PJSUA2开发文档--第三章 PJSUA2高级API

    3. PJSUA2高级API PJSUA2是PJSUA API以上的面向对象抽象.它为构建会话发起协议(SIP)多媒体用户代理应用程序(也称为IP / VoIP软电话)提供高级API.它将信令,媒体和 ...

  3. PJSUA2开发文档--第五章 帐户(号)Accounts

    第五章 帐户(号) 帐户提供正在使用该应用程序的用户的身份(或身份).一个帐户有一个与之相关的SIP统一资源标识符(URI).在SIP术语中,该URI用作该人的记录地址( Address of Rec ...

  4. PJSUA2开发文档--第四章 端点ENDPOINT

    4.端点ENDPOINT Endpoint类是一个单例类,应用程序必须在此类实例之前创建一个并且最多只能创建一个,然后才能执行任何操作.同样,一旦这个类被销毁,应用程序就不能调用该库的任何API.这个 ...

  5. PJSUA2开发文档--第十一章 网络问题

    11 网络问题 11.1 IP地址更改 请参阅wiki 处理IP地址更改.请注意,本指南使用PJSUA API作为参考. 11.2 被阻止/过滤的网络 请参阅维基百科 通过阻止或过滤的VoIP网络

  6. PJSUA2开发文档--第十二章 PJSUA2 API 参考手册

    12 PJSUA2 API 参考手册 12.1 endpoint.hpp PJSUA2基本代理操作.  namespace pj PJSUA2 API在pj命名空间内. 12.1.1 class En ...

  7. PJSUA2开发文档--第十章 媒体质量(MEDIA QUALITY)

    10 媒体质量(Media Quality) 10.1 音频质量 如果遇到音频质量问题,可尝试以下步骤: 遵循指南:使用pjsystest测试声音设备. 识别声音问题并使用以下步骤进行故障排除:检查声 ...

  8. PJSUA2开发文档--第九章 PJSUA2应用程序示例

    9. PJSUA2示例应用程序 9.1 示例应用程序 9.1.1 C++ pjsip-apps/src/samples/pjsua2_demo.cpp 是一个非常简单可用的C++示例应用程序. /* ...

  9. PJSUA2开发文档--第八章 好友(Buddy)类

    8  好友(存在)Buddy PJSUA2的功能是围绕Buddy类为中心展开的.该类表示一个远端好友(伙伴,一个人或一个SIP端点). 8.1 子类化Buddy类 要使用Buddy类,通常应创建子类, ...

随机推荐

  1. [Swift]LeetCode796. 旋转字符串 | Rotate String

    We are given two strings, A and B. A shift on A consists of taking string A and moving the leftmost ...

  2. [Swift]LeetCode934. 最短的桥 | Shortest Bridge

    In a given 2D binary array A, there are two islands.  (An island is a 4-directionally connected grou ...

  3. Linux 下源码编译FFMEG

    目录 1. 安装依赖关系 2. 源码安装 yasm 3. 源码安装 NASM 4. 源码安装libx264 5. 源码安装x265 6. 源码安装 libmp3lame 7. 源码安装 libopus ...

  4. MyBatis 处理关系运算符

    MyBatis mapper文件是xml文件,使用关系运算符需要进行转义. 关系运算符 转义后字符 < < <= <= > > > >=

  5. 用了 HTTPS 还不安全,问题就出在低版本 TLS 上

    HTTPS 加密时代已经来临,近两年,Google.Baidu.Facebook 等互联网巨头,不谋而合地开始大力推行 HTTPS, 2018 年 7 月 25 日,Chrome 68 上线,所有 H ...

  6. jenkins修改数据存放路径

    如果是用tomcat做容器的话,则在./bin/catalina.sh文件添加以下语句即可:export JENKINS_HOME="存放路径(需存在)" 例如:

  7. Redis学习——Windows环境下Redis的安装(二)

    一.说明 之前介绍了Linux环境下Redis的安装,这次介绍一下Windows环境下Redis的安装,首先要讲的是,Redis官方只支持Linux,还好 Microsoft Open Tech gr ...

  8. ConcurrentModificationException 异常处理

    在工作中碰到有个异常:java.util.ConcurrentModificationException 腾讯bugly工具给出的解决方案和说明如下:该异常表示迭代器迭代过程中,迭代的对象发生了改变, ...

  9. 服务测试碰钉子Server GC

    如果发现你的dotnet core服务并发上不去,但cpu资源还比较充足那就要注意了!因为这很有可能是你没有设置一个运行项导致...,下面要提到的就是GC.Server这玩意,实际上项目编译中并没有这 ...

  10. .net core通过多路复用实现单服务百万级别RPS吞吐

    多路复用其实并不是什么新技术,它的作用是在一个通讯连接的基础上可以同时进行多个请求响应处理.对于网络通讯来其实不存在这一说法,因为网络层面只负责数据传输:由于上层应用协议的制订问题,导致了很多传统服务 ...