Android 上的 WebRTC 自定义视频源
Custom video source for WebRTC on Android
概述
我想使用自定义视频源通过 WebRTC Android 实施来直播视频。如果我理解正确,现有的实现仅支持 Android phone 上的前置和后置摄像头。以下 类 与此场景相关:
目前在 Android phone 上使用前置摄像头,我正在执行以下步骤:
CameraEnumerator enumerator = new Camera1Enumerator(false);
VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);
VideoSource videoSource = peerConnectionFactory.createVideoSource(false);
videoCapturer.initialize(surfaceTextureHelper, this.getApplicationContext(), videoSource.getCapturerObserver());
VideoTrack localVideoTrack = peerConnectionFactory.createVideoTrack(VideoTrackID, videoSource);
我的场景
我有一个回调处理程序,它从自定义视频源接收字节数组中的视频缓冲区:
public void onReceive(byte[] videoBuffer, int size) {}
我怎样才能发送这个字节数组缓冲区?我不确定解决方案,但我想我必须实施自定义 VideoCapturer
?
存在的问题
This question 可能是相关的,虽然我没有使用 libjingle 库,只使用本机 WebRTC Android 包。
相似questions/articles:
- for iOS platform 但不幸的是我无法提供答案。
- for native C++ platform
- article about native implementation
这个问题有两种可能的解决方案:
- 在
onReceive
处理程序中使用 byte[]
流数据实施自定义 VideoCapturer
并创建 VideoFrame
。实际上有一个很好的例子FileVideoCapturer,它实现了VideoCapturer
.
- 只需从NV21Buffer构造
VideoFrame
,它是根据我们的字节数组流数据创建的。那么我们只需要使用我们之前创建的VideoSource
来捕捉这一帧即可。示例:
public void onReceive(byte[] videoBuffer, int size, int width, int height) {
long timestampNS = TimeUnit.MILLISECONDS.toNanos(SystemClock.elapsedRealtime());
NV21Buffer buffer = new NV21Buffer(videoBuffer, width, height, null);
VideoFrame videoFrame = new VideoFrame(buffer, 0, timestampNS);
videoSource.getCapturerObserver().onFrameCaptured(videoFrame);
videoFrame.release();
}
概述
我想使用自定义视频源通过 WebRTC Android 实施来直播视频。如果我理解正确,现有的实现仅支持 Android phone 上的前置和后置摄像头。以下 类 与此场景相关:
目前在 Android phone 上使用前置摄像头,我正在执行以下步骤:
CameraEnumerator enumerator = new Camera1Enumerator(false);
VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);
VideoSource videoSource = peerConnectionFactory.createVideoSource(false);
videoCapturer.initialize(surfaceTextureHelper, this.getApplicationContext(), videoSource.getCapturerObserver());
VideoTrack localVideoTrack = peerConnectionFactory.createVideoTrack(VideoTrackID, videoSource);
我的场景
我有一个回调处理程序,它从自定义视频源接收字节数组中的视频缓冲区:
public void onReceive(byte[] videoBuffer, int size) {}
我怎样才能发送这个字节数组缓冲区?我不确定解决方案,但我想我必须实施自定义 VideoCapturer
?
存在的问题
This question 可能是相关的,虽然我没有使用 libjingle 库,只使用本机 WebRTC Android 包。
相似questions/articles:
- for iOS platform 但不幸的是我无法提供答案。
- for native C++ platform
- article about native implementation
这个问题有两种可能的解决方案:
- 在
onReceive
处理程序中使用byte[]
流数据实施自定义VideoCapturer
并创建VideoFrame
。实际上有一个很好的例子FileVideoCapturer,它实现了VideoCapturer
. - 只需从NV21Buffer构造
VideoFrame
,它是根据我们的字节数组流数据创建的。那么我们只需要使用我们之前创建的VideoSource
来捕捉这一帧即可。示例:
public void onReceive(byte[] videoBuffer, int size, int width, int height) {
long timestampNS = TimeUnit.MILLISECONDS.toNanos(SystemClock.elapsedRealtime());
NV21Buffer buffer = new NV21Buffer(videoBuffer, width, height, null);
VideoFrame videoFrame = new VideoFrame(buffer, 0, timestampNS);
videoSource.getCapturerObserver().onFrameCaptured(videoFrame);
videoFrame.release();
}