的音视频处理

音频Audio和视频Video

音视频支持框架

需要设备底层具有音视频相关的硬件设备和驱动支持,为了适应各种音视频设备,抽象了2个层次。

第一层:音频硬件抽象层,向上提供统一的音视频操作接口,屏蔽不同硬件设备的实现细节差异。

在该层之上,增加音频控制层,运行在独立的线程内,用RPC与上层通信,将不同的音轨混合起来,输入到硬件中。

 

音视频中的解码编码、进度控制由专业的AnyChat内核完成,  

音视频的录制

一、API接口定义    AnyChat在客户端提供的录制API接口与回调事件为:



  1. // 用户音、视频录制(扩展)
  2. BRAC_API DWORD BRAC_StreamRecordCtrlEx(DWORD dwUserId, BOOL bStartRecord, DWORD dwFlags, DWORD dwParam, LPCTSTR lpUserStr);

  3. // 录像、快照任务完成扩展回调函数定义
  4. typedef void (CALLBACK * BRAC_RecordSnapShotEx_CallBack)(DWORD dwUserId, LPCTSTR lpFileName, DWORD dwElapse, DWORD dwFlags, DWORD dwParam, LPCTSTR lpUserStr, LPVOID lpUserValue);


复制代码



AnyChat在服务器端提供的录制API接口与回调事件为:



  1. // 中心端录像控制(扩展)
  2. BRAS_API DWORD BRAS_StreamRecordCtrlEx(DWORD dwUserId, BOOL bStartRecord, DWORD dwFlags, DWORD dwParam, LPCTSTR lpUserStr=NULL, DWORD dwRecordServerId=-1);

  3. // 服务器录像回调函数定义(扩展)
  4. typedef void (CALLBACK * BRAS_OnServerRecordEx_CallBack)(DWORD dwUserId, LPCTSTR lpFileName, DWORD dwElapse, DWORD dwFlags, DWORD dwParam, LPCTSTR lpUserStr, DWORD dwRecordServerId, LPVOID lpUserValue);


复制代码



二、录制API调用
    API第一个参数表示录制对象,指录制某一个用户的音视频,对于合成录制,只需要通过第三个参数(dwFlags)加入特定的标志即可实现。

    开始录制以及停止录制均调用同一个API接口(如客户端为:BRAC_StreamRecordCtrlEx),通过第二个参数(bStartRecord)来控制,当bStartRecord=TRUE(1)时,表示开始录制,当bStartRecord=FALSE(0)时,表示停止录制。

    当调用API开始录制时,相当于下达了一个录制任务,AnyChat内核将开始录制,可以在客户端调用API(BRAC_QueryUserState)来查询录制状态;通过第三个参数(dwFlags)可控制录制行为:是在客户端录制,还是在服务器录制;是录制音频,还是音视频一同录制;是录制单个用户,还是通话双方合成录制等,具体应用可参考后续的“录制功能示例”部分。

    当调用API停止录制时,AnyChat内核会结束录制任务,同时触发上层应用的回调事件(如客户端为:BRAC_RecordSnapShotEx_CallBack),在回调事件中,将录制文件名(含路径)、录制时长、用户自定义参数等信息返回给上层应用。

    AnyChat内核提供了两个自定义参数,一个是整形(dwParam),一个是字符串类型(lpUserStr),在开始录制时通过API接口传入,在录制完成回调事件中返回给上层应用,如可以通过字符串类型自定义参数来传输一个上层应用的业务流水号,则可以实现在回调事件中将录制的文件名与业务流水号进行关联,保存在数据库中等功能。

三、录制功能示例
下面以JavaScript脚本为例,针对常用的录制功能给出示例代码:

1、客户端对单个用户的音频、视频进行录制,录制为MP4格式



1. BRAC_SetSDKOption(BRAC_SO_RECORD_FILETYPE, 0);    // 录制为MP4格式
2. var dwFlags = ANYCHAT_RECORD_FLAGS_VIDEO + ANYCHAT_RECORD_FLAGS_AUDIO;
3. BRAC_StreamRecordCtrlEx(userid, 1,  dwFlags, 0, "Hello, world!");


复制代码



2、客户端对单个用户的音频进行录制,录制为MP3格式


1. BRAC_SetSDKOption(BRAC_SO_RECORD_FILETYPE, 3);    // 录制为MP3格式
2. var dwFlags = ANYCHAT_RECORD_FLAGS_AUDIO;
3. BRAC_StreamRecordCtrlEx(userid, 1,  dwFlags, 0, "Hello, world!");


复制代码



3、客户端对通话双方的音频、视频进行录制,录制为MP4格式,画中画模式:



1. BRAC_SetSDKOption(BRAC_SO_RECORD_FILETYPE, 0);    // 录制为MP4格式
2. var dwFlags = ANYCHAT_RECORD_FLAGS_VIDEO + ANYCHAT_RECORD_FLAGS_AUDIO + ANYCHAT_RECORD_FLAGS_MIXVIDEO + ANYCHAT_RECORD_FLAGS_MIXAUDIO;
3. BRAC_StreamRecordCtrlEx(userid, 1,  dwFlags, 0, "Hello, world!");


复制代码



四、其它
1、客户端可以通过API:BRAC_SetSDKOption(BRAC_SO_RECORD_TMPDIR, path)来设置录像文件保存路径;2、客户端可以通过API:BRAC_SetSDKOption(BRAC_SO_RECORD_VIDEOBR, bitrate)来设置录制视频的质量,调节录制视频的清晰度;
3、有关录像文件改名:录制完成之后,AnyChat将触发上层应用的录制完成回调事件,在回调事件中返回录制文件名(含路径),上层应用可以在回调事件中调用操作系统提供的文件改名函数(如Windows平台为:MoveFile函数)对文件进行改名操作,AnyChat内核本身没有提供对录制文件名进行修改的接口;