NIMSDK-AOS  10.9.80
AVChatExternalVideoCapturer.java
浏览该文件的文档.
1 /*
2  * Copyright (c) 2014-2018 NetEase, Inc.
3  * All right reserved.
4  */
5 
6 package com.netease.nimlib.sdk.avchat.video;
7 
8 import android.os.SystemClock;
9 
10 import com.netease.nimlib.log.NimLog;
13 import com.netease.nrtc.sdk.video.ExternalVideoCapturer;
14 import com.netease.nrtc.sdk.video.IVideoCapturer;
15 import com.netease.nrtc.sdk.video.VideoFrame;
16 
17 import com.netease.nrtc.utility.video.VideoUtils;
18 
19 
20 /**
21  * 继承该类,实现自定义外部视频数据输入
22  */
23 
24 public abstract class AVChatExternalVideoCapturer extends ExternalVideoCapturer implements AVChatVideoCapturer {
25 
26  /**
27  * 开始预览
28  *
29  * @param width 采集宽
30  * @param height 采集高
31  * @param frameRate 采集分辨率
32  */
33  public abstract void startCapture(int width, int height, int frameRate);
34 
35  /**
36  * 关闭预览
37  *
38  * @throws InterruptedException
39  */
40  public abstract void stopCapture() throws InterruptedException;
41 
42  /**
43  * 修改采集的参数
44  *
45  * @param width 采集宽
46  * @param height 采集高
47  * @param frameRate 采集分辨率
48  */
49  public abstract void changeCaptureFormat(int width, int height, int frameRate);
50 
51  /**
52  * 销毁
53  */
54  public abstract void dispose();
55 
56 
57  @Override
58  public IVideoCapturer asVideoCapturer() {
59  return this;
60  }
61 
62 
63  /**
64  * 外部调用,用于通知SDK外部是否已经成功开启视频数据提交
65  *
66  * @param success 是否成功开启
67  */
68  public void onCapturerStarted(boolean success) {
69  VideoCapturerObserver observer = AVChatExternalVideoCapturer.super.getVideoCapturerObserver();
70  if (observer != null) {
71  observer.onCapturerStarted(success);
72  }
73  }
74 
75 
76  /**
77  * 外部调用,用于通知SDK外部已经停止视频数据提交
78  */
79  public void onCapturerStopped() {
80  VideoCapturerObserver observer = AVChatExternalVideoCapturer.super.getVideoCapturerObserver();
81  if (observer != null) {
82  observer.onCapturerStopped();
83  }
84  }
85 
86 
87  /**
88  * 外部调用,用于提交每一帧视频数据
89  *
90  * @param data 视频数据
91  * @param dataLen 视频数据宽度
92  * @param width 视频数据高度
93  * @param height 视频数据高度
94  * @param rotation 视频画面旋转角度,为90度倍数,以顺时针为正方向
95  * @param frameRate 输入的帧率,大于0,如果帧率过大,内部会做丢帧处理
96  * @param format 视频数据格式 {@link AVChatImageFormat#I420}、{@link AVChatImageFormat#NV21}
97  * @param timeStamp 视频帧时间戳,以{@link AVChatManager#enableRtc()}创建时刻为开始的基准时间,使用{@link SystemClock#elapsedRealtime()}即可
98  * @param mirror 是否需要镜像,如果设置为{@code true},在旋转之后进行
99  * @return 视频帧数据是否提交成功,0成功,其他失败。
100  * <p>-1-数据为空或长度不合法;
101  * <p>-2-长宽不合法,如超过最大分辨率1920*1080或长宽和数据长度不匹配;
102  * <p>-3-旋转角度不合法;
103  * <p>-4-帧率不合法;
104  * <p>-5-数据格式不合法;
105  * <p>-10-其他错误;
106  */
107  public int onByteBufferFrameCaptured(byte[] data,
108  int dataLen,
109  int width,
110  int height,
111  int rotation,
112  int frameRate,
113  int format,
114  long timeStamp,
115  boolean mirror) {
116 
117  int ret = -10;
118  VideoCapturerObserver observer = AVChatExternalVideoCapturer.super.getVideoCapturerObserver();
119 
120  if (data == null) {
121  NimLog.e("AVChatExternalVideoCapturer", "data is null");
122  return -1;
123  }
124 
125  if (data.length < dataLen || VideoUtils.calcBufferSize(format, width, height) != data.length) {
126  NimLog.e("AVChatExternalVideoCapturer", "Illegal data length!");
127  return -2;
128  }
129 
130  try {
131  VideoFrame.Buffer buffer = VideoFrame.asBuffer(data, format, width, height);
132  VideoFrame videoFrame = new VideoFrame(buffer, rotation, timeStamp);
133  if (observer != null) {
134  ret = observer.onFrameCaptured(videoFrame, frameRate, mirror);
135  }
136 
137  videoFrame.release();
138  } catch (IllegalAccessException e) {
139  NimLog.e("AVChatExternalVideoCapturer", " onByteBufferFrameCaptured " + e);
140  }
141 
142  return ret;
143  }
144 }
abstract void startCapture(int width, int height, int frameRate)
开始预览
void onCapturerStopped()
外部调用,用于通知SDK外部已经停止视频数据提交
void onCapturerStarted(boolean success)
外部调用,用于通知SDK外部是否已经成功开启视频数据提交
继承该类,实现自定义外部视频数据输入
abstract void changeCaptureFormat(int width, int height, int frameRate)
修改采集的参数
int onByteBufferFrameCaptured(byte[] data, int dataLen, int width, int height, int rotation, int frameRate, int format, long timeStamp, boolean mirror)
外部调用,用于提交每一帧视频数据