一、录音

1.1、单腿录音

originate user/1000 &record(/tmp/welcome. wav)

        上述命令大家已经很熟悉了,我们呼叫1000,1000接听后即可以直接讲话并录音。由于这种录音方式仅涉及一条腿(leg,即一个 Channel),因而称为单腿录音。另外,我们也可以在 Dialplan中录音(与上述命令是等价的)

<extension name=" record">
<condition field="destination number"expression="rec(.*)S">
<action application="answer"/>
<action application="playback"data="tone stream: //8(100, 1000, 800)"/>
<action application="record"data="/tmp/S1. wav"/>
</condition>
</extension>

        通过设置上述 Dialplan,呼叫一个rec开头的号码,如 recwelcome,就可以开始录音并将录音文件保存到/tmp/ welcome.wav中,同样也可以通过拨打其他的号码录不同名称的声音文件。另外,为了在录音前给个提示,可以在 record前先用 playback播放一段提示音,如“请在嘀声后开始录音”。在本例中,我们仅用 playback播放了一个“嘀”声,该声音是用 tone strean产生的。

        在这种录音方式中,由于只有一个 Channel,所以录音文件是单声道的。我们可以直接用下面的方式使用 playback来测试播放刚才的录音:

freeswitch> originate user/1000 playback(/tmp/welcome. wav

     上述命令呼叫1000,1000接听后就可以听到刚刚录制的声音了。

1.2、对两条腿录音

uuid record <channel uuid> start/tmp/record. wav

        如果决定不录音了,则可以使用以下命令停止录音:

uuid record <channel uuid> stop /tmp/record. wav

        该录音文件会包含两个声道,以后要使用 playback播放这种录音时,会在日志中看到如下的警告信息

freeswitch> originate user/1000 &playback(/tmp/record. wav
[WARNING] switch core file. c: 229 File has 2 channels, muxing to mono will occur

        这条信息表示,该文件有两个声道,但 playback仅是对一个 Channel I而言的,它仅支持一个声道。因而, FREESWITCH会先将两个声道混音,变成一个声道后再播放。该警告一般是无害的。只是,由于在播放时会进行混音,会多占用一些CPU,因而在高并发的场合,可以使用一些工具事先将声音文件混为一个声道。如我们可以使用sox命令行进行混音:

 sox record. wav-c 1 record-1.wav

        其中,“-c”指定 Channel的数量。我们这里用的是“-c1”,就是说将原来的声音文件混成一个声道。可以使用以下ls命令,从中看到混音后的声音文件大小比原来的大约小了一半(从136364到了68204)

ls -l      /tmp/record*. wav
--1 duiinfang wheel 136364 Sep 23 15: 21 record. wav
-r--1 dujinfang wheel 68204 Sep 23 15: 45 record-1 wav

        另外,也可以使用sox附带的play命令在操作系统命令行上播放声音文件,并查看一些详细的信息,如(注意,该命令在声卡驱动不正常时是不能使用的)

play /tmp/record. wav

        实际上,录音使用的是 Freeswitch中的 Media Bug功能(即8.3.4节讲的“三通”声音媒体数据通过一个“三通”流到录音文件中,FREESWITCH支持同时创建多个 Media Bug,因而可以同时录制多个声音文件,这在需要截取不同时间段的录音时非常有用,如可以在不同的时间点分别执行下列命令:

uuid record <channel uuid> start /tmp/1. wav
uuid record <channel uuid> start /tmp/2. wav
uuid record <channel uuid> start /tmp/3. wav

        可以随时用对应的stop指令停止某个录音,也可以使用特殊的文件名“al”同时停止所有录音,如:

uuid record <channel uuid> stop all

        当然,如果在录音过程中电话挂断了,所有录音也就自动停止了。另外,在 Dialplan中,也可以通过 record session达到类似的效果,如:

<extension name= record">
<condition field="destination number"expression=".(100[0-9])S">
<action application="record session"data="/tmp/record-s1 wav"/>
<action application="bridge"data="user/S1"/>
</condition>
</extension>

        其中,在执行 bridge前使用 record session开始对当前的 Channel进行录音。与uidrecord不同的是, record sesion是一个App,而前者是一个API。相同的是两者在执行时都会为当前的 Channel添加一个 Media Bug,因而可以实时录音。 

1.3、立体声 

        通过事先将 RECORD STEREO通道变量设置为true可以在录音时直接录成立体声。在Dialplan中使用 record session时的设置如下:

<action application="set"data="RECORD STEREO=true"/>
<action application="record session"data="/tmp/record-s1 wav"/>

        当然,也可以在使用 uuid record录音前使用 uuid setvar设定该通道变量,从而录制成立体声的声音文件。这种方式与上述方式等价,具体命令如下:

freeswitch> uuid setvar <channel uuid> RECORD STEREO true
freeswitch> uuid record
nnel uuid> start/tmp/record. wav

1.4、 原生格式

        如果在录音时不提供录音文件的扩展名,就可以以原生的格式录音,例如,下列命令会将录音文件录成/ mp/test PCMU:

freeswitch> originate user/1000 &record(/tmp/test)

        对于一个两条腿的通话,也可以使用 uuid record进行原生方式的录音,如:

freeswitch> uuid record b40dec66-2f47-480d-88bb-335a025d856e start/tmp/test
[INFO] mod native file. c: 94 Opening File [/tmp/test-in PCMU] 8000hz
[INFO] mod native file.c: 94 Opening File [/tmp/test-out PCMU] 8000hz
I DEBUG] switch core media bug.c: 532 Attaching BUG to sofia/internal/
1001@123.130.116,42

        从日志中可以看出,由于该通话有两条腿,而原生的格式不支持混音,因此只能将双向的声道录到两个不同的文件中,如上面的“-in”和“-out”分别代表“入”和“出”。
        PCM格式的原生文件可以使用sox软件中的play命令播放,如:

play-e u-law-r 8000.-t raw test-in PCMU

        注意,由于原生格式的录音文件中不包含录音数据的元信息(即编码、采样率、声道等参数),因而需要在播放时指定。在上述命令中,“-e”指定了编码为“u-law”,即μ律;-r”参数指定采样率为8000Hz;-traw说明以原生格式播放。当然,也可以使用如下的sox命令将该原生格式的文件转换成WAV文件:

sox-e u-law-r8000-t raw test-in PCMU test-in wav
sox-e u-1aw-r8000-traw test-out PCMU test-out. wav

        也可以进一步将上述两路文件合成一个文件。下列两条命令都可以将两个声音文件合成到一个中去,其中前者将进行混音,而后者将合成立体声的。 

sox test-in. wav test-out. wav-m test wav
sox test-inwav test-out. wav-m test wav