如果开发者想在 TRTC 中集成第三方美颜库来实现美颜、滤镜等功能,第三方库的美颜功能输入数据格式支持有 camera 的原始数据(YUV 数据)、纹理数据(Textureid)。开发者想实现该功能,需要采用自定义采集视频数据接口,然后复用 LiteAVSDK 的编码和推流功能。
1)先定义个内部类,然后继承 TRTCCloudListener 抽象类并重写你需要监听的事件(eg:用户加入房间、用户退出房间、警告信息、错误信息等)。
2)获取 TRTCCloud 单例对象,调用 setListener 方法设置 TRTCCloudListener 回调。
public class TRTCMainActivity extends Activity {
private TRTCCloudDef.TRTCParams trtcParams; /// TRTC SDK 视频通话房间进入所必须的参数
private TRTCCloud trtcCloud; /// TRTC SDK 实例对象
private TRTCCloudListener trtcListener; /// TRTC SDK 回调监听
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//应用运行时,保持屏幕高亮,不锁屏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , WindowManager.LayoutParams.FLAG_FULLSCREEN);
//创建 TRTC SDK 实例
trtcListener = new TRTCCloudListenerImpl(this);
trtcCloud = TRTCCloud.sharedInstance(this);
trtcCloud.setListener(trtcListener);
trtcCloud.setLogLevel(TRTCCloudDef.TRTC_LOG_LEVEL_DEBUG);
trtcCloud.setConsoleEnabled(true);
}
/**
* SDK内部状态回调
*/
static class TRTCCloudListenerImpl extends TRTCCloudListener {
private WeakReference<TRTCMainActivity> mContext;
public TRTCCloudListenerImpl(TRTCMainActivity activity) {
super();
mContext = new WeakReference<>(activity);
}
/**
* 加入房间
*/
@Override
public void onEnterRoom(long elapsed) {
TRTCMainActivity activity = mContext.get();
if (activity != null) {
Toast.makeText(activity, "加入房间成功", Toast.LENGTH_SHORT).show();
activity.mVideoViewLayout.onRoomEnter();
isPush = true;
}
}
/**
* 离开房间
*/
@Override
public void onExitRoom(int reason) {
TRTCMainActivity activity = mContext.get();
if (activity != null) {
Toast.makeText(activity, "退出房间", Toast.LENGTH_SHORT).show();
activity.finishActivity();
isPush = false;
}
}
}
TRTCParams 是 SDK 最关键的一个参数,它包含如下四个必填的字段 sdkAppId,userId,userSig 和 roomId。
Android:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
//创建 TRTC SDK 实例
trtcListener = new TRTCCloudListenerImpl(this);
trtcCloud = TRTCCloud.sharedInstance(this);
trtcCloud.setListener(trtcListener);
// TRTC SDK 视频通话房间进入所必须的参数
Intent intent = getIntent();
int sdkAppId = intent.getIntExtra("sdkAppId", 0);
int roomId = intent.getIntExtra("roomId", 0);
String selfUserId = intent.getStringExtra("userId");
String userSig = intent.getStringExtra("userSig");
trtcParams = new TRTCCloudDef.TRTCParams(sdkAppId, selfUserId, userSig, roomId, "", "");
}
设置本地大画面(上行)、远端小画面(远端观众、下行)的编码参数
Android:
private void setTRTCCloudParam() {
// 大画面的编码器参数设置
// 设置视频编码参数,包括分辨率、帧率、码率等等,这些编码参数来自于 TRTCSettingDialog 的设置
// 注意(1):不要在码率很低的情况下设置很高的分辨率,会出现较大的马赛克
// 注意(2):不要设置超过25FPS以上的帧率,因为电影才使用24FPS,我们一般推荐15FPS,这样能将更多的码率分配给画质
TRTCCloudDef.TRTCVideoEncParam encParam = new TRTCCloudDef.TRTCVideoEncParam();
encParam.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_640_480;
encParam.videoFps = 15;
encParam.videoBitrate = 600;
encParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;
trtcCloud.setVideoEncoderParam(encParam);
TRTCCloudDef.TRTCNetworkQosParam qosParam = new TRTCCloudDef.TRTCNetworkQosParam();
qosParam.controlMode = TRTCCloudDef.VIDEO_QOS_CONTROL_SERVER;
qosParam.preference = TRTCCloudDef.TRTC_VIDEO_QOS_PREFERENCE_CLEAR;
trtcCloud.setNetworkQosParam(qosParam);
//小画面的编码器参数设置
//TRTC SDK 支持大小两路画面的同时编码和传输,这样网速不理想的用户可以选择观看小画面
//注意:iPhone & Android 不要开启大小双路画面,非常浪费流量,大小路画面适合 Windows 和 MAC 这样的有线网络环境
TRTCCloudDef.TRTCVideoEncParam smallParam = new TRTCCloudDef.TRTCVideoEncParam();
smallParam.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_160_90;
smallParam.videoFps = 15;
smallParam.videoBitrate = 100;
smallParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;
trtcCloud.enableEncSmallVideoStream(false, smallParam);
trtcCloud.setPriorRemoteVideoStreamType(settingDlg.priorSmall?TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_SMALL:TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG);
}
设置 enableCustomVideoCapture 值为 true,告知 TRTC SDK 使用自定义采集数据。然后使用步骤3组装的 TRTCCloudParam 进入房间。
private void enterRoom() {
// 预览前配置默认参数
setTRTCCloudParam();
// 【重要】设置自定义采集数据方法【一定要开启】
trtcCloud.enableCustomVideoCapture(true);
//进房
trtcCloud.enterRoom(trtcParams, TRTCCloudDef.TRTC_APP_SCENE_VIDEOCALL);
}
根据数据类型,构造自定义数据 TRTCVideoFrame 对象,然后调用发送自定义数据接口 trtcCloud.sendCustomVideoData(trtcVideoFrame) 将数据塞给 TRTC SDK。
// 这里以发送摄像头回调数据为例子
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (!isPush) {
// Log.i(TAG, "length of data === " + data.length);
} else {
// 开始自定义推流
// 一般前置摄像头有270度的旋转,后置摄像头有90的旋转。所以要对YUV数据进行一定旋转操作
// 这里使用到前置摄像头, 所以旋转 270 度
// 如果使用到后置摄像头, 请自行处理
byte[] ratateBuffer = new byte[data.length];
ratateBuffer = rotateYUVDegree270(data, mPreviewWidth, mPreviewHeight);
Log.i(TAG, "previewSize:width: " + mPreviewWidth + " height: " + mPreviewHeight);
TRTCCloudDef.TRTCVideoFrame trtcVideoFrame = new TRTCCloudDef.TRTCVideoFrame();
trtcVideoFrame.data = data;
trtcVideoFrame.bufferType = TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_BYTE_ARRAY;
trtcVideoFrame.pixelFormat = TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_NV21;
trtcVideoFrame.height = mPreviewWidth;
trtcVideoFrame.width = mPreviewHeight;
trtcCloud.sendCustomVideoData(trtcVideoFrame);
}
}
/**
* 对前置摄像头采集到的数据做 270 度的旋转
* @param data
* @param imageWidth
* @param imageHeight
* @return
*/
private byte[] rotateYUVDegree270(byte[] data, int imageWidth, int imageHeight) {
byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];
// Rotate the Y luma
int i = 0;
for (int x = imageWidth - 1; x >= 0; x--) {
for (int y = 0; y < imageHeight; y++) {
yuv[i] = data[y * imageWidth + x];
i++;
}
}// Rotate the U and V color components
i = imageWidth * imageHeight;
for (int x = imageWidth - 1; x > 0; x = x - 2) {
for (int y = 0; y < imageHeight / 2; y++) {
yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + (x - 1)];
i++;
yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + x];
i++;
}
}
return yuv;
}
名称 | 类型 | 描述 |
---|---|---|
buffer | ByteBuffer | 视频数据(BUFFER) |
bufferType | int | 数据缓冲区类型TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_BYTE_ARRAYTRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_BYTE_BUFFER |
data | byte[] | 视频数据(ARRAY) |
height | int | 视频高度 |
pixelFormat | int | 视频类型TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_I420TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2DTRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_TEXTURE_EXTERNAL_OESTRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_NV21 |
rotation | int | 视频角度 |
textureId | int | 纹理id(pixelFormat为Texture_2D 或 TEXTURE_EXTERNAL_OES) |
width | int | 视频宽度 |
相关参考文档:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。