设为首页收藏本站

AnyChat技术支持论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2193|回复: 0

2017-12-28 AnyChat多路音视频显示与录制开发指南

[复制链接]

10

主题

253

帖子

1405

积分

金牌会员

Rank: 6Rank: 6

积分
1405
发表于 2017-12-28 18:56:50 | 显示全部楼层 |阅读模式
本帖最后由 佰锐科技-梁国桦 于 2018-1-3 15:53 编辑

AnyChat提供多路音视频输入和音视频录制功能,本文将分两个章节来讲述这两个功能如何实现。

1.多路音视频输入
本节讲述多路音视频输入(含桌面共享)的步骤。所有代码均为JavaScript代码。

1.1设置共享桌面
初始化后,调用以下API,设置启用桌面共享:
  1. BRAC_SetSDKOption(BRAC_SO_CORESDK_SCREENCAMERACTRL, 1);
复制代码
1.2枚举视频设备
调用以下API,或者视频设备,其中桌面共享虚拟摄像头(设备名:Native Screen Camera)一般是数组的最后一个:
  1. var videoCaptureList = [];
  2. videoCaptureList = BRAC_EnumDevices(BRAC_DEVICE_VIDEOCAPTURE);
复制代码
1.3绑定视频设备与视频流号
视频流号默认从0开始,需要注意的是,如果以后需要单独使用或者操作指定某号流,一定需要把视频设备与视频流号绑定起来,因为默认情况下视频流号与视频设备并不是一一对应的。
把获取的视频设备分别设置不同的视频流号(这里例子用for循环来设置,从0开始设置流号):
  1. for(var i=0; i<videoCaptureList.length; i++) {
  2. BRAC_SetUserStreamInfo(mSelfUserId, i, BRAC_SO_LOCALVIDEO_DEVICENAME, videoCaptureList[i]);
  3. }
复制代码
1.4设置视频流显示位置
以设置0号视频流显示位置为例,JavaScript示例代码如下:
  1. // 设置视频流显示位置(由最后一个参数传入流号)
  2. // 把0号流显示在AnyChatLocalVideoDiv0上,其他流号亦然;要设置多个视频流显示位置就调用多次,每次传不同的div、objectId和视频流号即可
  3. BRAC_SetVideoPosEx(mSelfUserId, document.getElementById("AnyChatLocalVideoDiv0"), "ANYCHAT_VIDEO_LOCAL_0", 0);
复制代码
PS:第一个参数传入其他用户的userid,最后一个参数传入视频流号时,表示把该用户的某号视频流显示在指定的div上

1.5打开/关闭音视频
以打开/关闭0号视频流为例,JavaScript示例代码如下:
  1. // 打开本地的0号流(第二个参数控制开关,第三个参数传入流号)
  2. BRAC_UserCameraControlEx(mSelfUserId, 1, 0, 0, "");

  3. // 关闭本地的0号流(第二个参数控制开关,第三个参数传入流号)
  4. BRAC_UserCameraControlEx(mSelfUserId, 0, 0, 0, "");

复制代码
PS:第一个参数传入其他用户的userid,第三个参数某个视频流号时,表示请求/中断该用户的某路视频流

1.6设置某路视频流的视频参数
定义一个函数来设置某路视频流的视频参数,之后只要调用该函数,传入视频流和视频参数即可,JavaScript示例代码如下:
  1. // deviceIdx为传入的视频流号
  2. function videoStreamParamsSetting(deviceIdx, bitRate, videoWidth, videoHeight, fps, gop) {
  3.         // 设置本地视频编码的码率(如果码率为0,则表示使用质量优先模式)
  4.         BRAC_SetUserStreamInfo(-1,deviceIdx,BRAC_SO_LOCALVIDEO_BITRATECTRL,bitRate);
  5.         
  6.         // 设置本地视频采集分辨率
  7.         BRAC_SetUserStreamInfo(-1,deviceIdx,BRAC_SO_LOCALVIDEO_WIDTHCTRL, videoWidth);
  8.         BRAC_SetUserStreamInfo(-1,deviceIdx,BRAC_SO_LOCALVIDEO_HEIGHTCTRL, videoHeight);

  9.         // 设置本地视频编码的帧率
  10.         BRAC_SetUserStreamInfo(-1,deviceIdx,BRAC_SO_LOCALVIDEO_FPSCTRL,fps);

  11.         // 设置本地视频编码的关键帧间隔
  12.         BRAC_SetUserStreamInfo(-1,deviceIdx,BRAC_SO_LOCALVIDEO_GOPCTRL, gop);

  13.         // 让视频参数生效
  14.         BRAC_SetUserStreamInfo(-1,deviceIdx,BRAC_SO_LOCALVIDEO_APPLYPARAM,1);        
  15. }
复制代码
PS:建议先调用设置视频流视频参数函数,再设置视频流显示位置和打开视频流。

2.多路音视频录制与拍照           
AnyChat提供了完善的拍照、录像解决方案,既支持客户端本地拍照、录像,也支持服务器端拍照、录像。拍照、录像的标志位定义请参考附录I。   
该章节主要讲述多路音视频情况下的录制方案,所有代码均为JavaScript代码。

2.1多路视频拍照
实现方式:在拍照时,dwFlags参数增加标志位:ANYCHAT_RECORD_FLAGS_SNAPSHOT,同时lpUserStr参数为Json字符串,使用“streamindex”为关键字传入需要拍照的流序号。拍照之前需要确认流已经正常打开。
支持的拍照方式:本地拍照、服务器拍照。
以本地拍照为例,JavaScript示例代码如下:
  1. var dwFlags = ANYCHAT_RECORD_FLAGS_SNAPSHOT;
  2. // 拍下1号视频流的快照
  3. var szUserStr = '{"streamindex":1}';
  4. // 第一个参数为userid,-1表示本地用户。第二个参数在拍照时必须为1。
  5. // 此代码表示拍下本地用户1号视频流的快照
  6. var errorCode = BRAC_StreamRecordCtrlEx(-1, 1, dwFlags, 0, szUserStr);
复制代码

2.2多路音视频录像

  
2.2.1录制房间内所有视频流
AnyChat支持合成并录制房间内包括本地的所有视频流和房间内其他用户的所有视频流。
实现方式:用BRAC_StreamRecordCtrlEx接口,最后一个参数传空字符串。
支持的录制方式:仅服务器合成流。
JavaScript示例代码如下:
  1. // 设置录像标志位(服务器合成流)
  2. var recordParams =        ANYCHAT_RECORD_FLAGS_VIDEO + ANYCHAT_RECORD_FLAGS_AUDIO +
  3. ANYCHAT_RECORD_FLAGS_MIXAUDIO + ANYCHAT_RECORD_FLAGS_MIXVIDEO +
  4. ANYCHAT_RECORD_FLAGS_STEREO + BRAC_RECORD_FLAGS_LOCALCB +
  5. BRAC_RECORD_FLAGS_SERVER + BRAC_RECORD_FLAGS_STREAM;
  6. // 开始录制
  7. var errorCode = BRAC_StreamRecordCtrlEx(-1, 1, recordParams, 0, "");
  8. // 结束录制
  9. var errorCode = BRAC_StreamRecordCtrlEx(-1, 0, recordParams, 0, "");
复制代码

2.2.2录制房间内指定的视频流

AnyChat支持合成并录制房间内包括自己和其他用户指定的视频流,某个视频流的指定方式为userid与streamindex的组合。
实现方式:用BRAC_StreamRecordCtrlEx接口,最后一个参数传入包含”streamlist”关键字的JSON字符串。”streamlist”关键字的内容为包含”userid”和”streamindex”关键字的对象组成的数组。
支持的录制方式:本地合成录制、服务器合成流录制。
以本地合成录制为例,JavaScript示例代码如下:
  1. // 设置录像标志位(本地合成录制)
  2. var recordParams =        ANYCHAT_RECORD_FLAGS_VIDEO + ANYCHAT_RECORD_FLAGS_AUDIO +
  3. ANYCHAT_RECORD_FLAGS_MIXAUDIO + ANYCHAT_RECORD_FLAGS_MIXVIDEO +
  4. ANYCHAT_RECORD_FLAGS_STEREO;

  5. // 指定录制本地1号流和userid为-23用户的0号流
  6. var jsonObj = {
  7.     streamlist: [
  8.         {
  9.             userid: -1,
  10.             streamindex: 1
  11.         },
  12.         {
  13.             userid: -23,
  14.             streamindex: 0
  15.         }
  16.     ]
  17. };

  18. // 开始录制
  19. var errorCode = BRAC_StreamRecordCtrlEx(-1, 1, recordParams, 0, JSON.stringify(jsonObj));

  20. // 结束录制
  21. var errorCode = BRAC_StreamRecordCtrlEx(-1, 0, recordParams, 0, "");
复制代码
PS:指定视频流的json里也可以传入本地的多个视频流,表示录制本地的某几路视频流。录制其他用户亦然。比如:streamlist:[{userid:-1, streamindex:0}, {userid:-1, streamindex:1}]
  
  
附录I:录像功能标志定义
  1. // 录像功能标志定义(API:BRAC_StreamRecordCtrl 传入参数)
  2. var BRAC_RECORD_FLAGS_VIDEO                =        0x00000001;        // 录制视频
  3. var BRAC_RECORD_FLAGS_AUDIO                =        0x00000002;        // 录制音频
  4. var BRAC_RECORD_FLAGS_SERVER        =        0x00000004;        // 服务器端录制
  5. var BRAC_RECORD_FLAGS_MIXAUDIO         =        0x00000010;        // 录制音频时,将其它人的声音混音后录制
  6. var BRAC_RECORD_FLAGS_MIXVIDEO        =        0x00000020;        // 录制视频时,将其它人的视频迭加后录制
  7. var BRAC_RECORD_FLAGS_ABREAST        =        0x00000100;        // 录制视频时,将其它人的视频并列录制
  8. var BRAC_RECORD_FLAGS_STEREO        =        0x00000200;        // 录制音频时,将其它人的声音混合为立体声后录制
  9. var BRAC_RECORD_FLAGS_SNAPSHOT        =        0x00000400;        // 拍照
  10. var BRAC_RECORD_FLAGS_LOCALCB        =        0x00000800;        // 触发本地回调
  11. var BRAC_RECORD_FLAGS_STREAM        =        0x00001000;        // 对视频流进行录制(效率高,但可能存在视频方向旋转的问题)
  12. var BRAC_RECORD_FLAGS_USERFILENAME=        0x00002000;        // 用户自定义文件名

  13. // 客户端、服务器端录制标志定义保持统一
  14. var ANYCHAT_RECORD_FLAGS_VIDEO        =        BRAC_RECORD_FLAGS_VIDEO;
  15. var ANYCHAT_RECORD_FLAGS_AUDIO        =        BRAC_RECORD_FLAGS_AUDIO;
  16. var ANYCHAT_RECORD_FLAGS_SERVER        =        BRAC_RECORD_FLAGS_SERVER;
  17. var ANYCHAT_RECORD_FLAGS_MIXAUDIO =        BRAC_RECORD_FLAGS_MIXAUDIO;
  18. var ANYCHAT_RECORD_FLAGS_MIXVIDEO =        BRAC_RECORD_FLAGS_MIXVIDEO;
  19. var ANYCHAT_RECORD_FLAGS_ABREAST =        BRAC_RECORD_FLAGS_ABREAST;
  20. var ANYCHAT_RECORD_FLAGS_STEREO        =        BRAC_RECORD_FLAGS_STEREO;
  21. var ANYCHAT_RECORD_FLAGS_SNAPSHOT =        BRAC_RECORD_FLAGS_SNAPSHOT;
  22. var ANYCHAT_RECORD_FLAGS_LOCALCB =        BRAC_RECORD_FLAGS_LOCALCB;
  23. var ANYCHAT_RECORD_FLAGS_STREAM =        BRAC_RECORD_FLAGS_STREAM;
  24. var ANYCHAT_RECORD_FLAGS_USERFILENAME = BRAC_RECORD_FLAGS_USERFILENAME;
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|AnyChat ( 粤ICP备13022410号-1 )  

GMT+8, 2020-8-8 02:58 , Processed in 0.153229 second(s), 23 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表