Overview
我想使用自定义视频源通过 WebRTC Android 实现来直播视频。如果我理解正确的话,现有的实现仅支持 Android 手机上的前置和后置摄像头。以下类与此场景相关:
- Camera1Enumerator.java https://chromium.googlesource.com/external/webrtc/+/HEAD/sdk/android/api/org/webrtc/Camera1Enumerator.java
- 视频采集器.java https://chromium.googlesource.com/external/webrtc/+/HEAD/sdk/android/api/org/webrtc/VideoCapturer.java
- 对等连接工厂 https://chromium.googlesource.com/external/webrtc/+/HEAD/sdk/android/api/org/webrtc/PeerConnectionFactory.java
- 视频源.java https://chromium.googlesource.com/external/webrtc/+/HEAD/sdk/android/api/org/webrtc/VideoSource.java
- VideoTrack.java https://chromium.googlesource.com/external/webrtc/+/HEAD/sdk/android/api/org/webrtc/VideoTrack.java
目前,为了在 Android 手机上使用前置摄像头,我正在执行以下步骤:
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
?
现有问题
这个问题 https://stackoverflow.com/questions/23654425/create-a-webrtc-videotrack-with-a-custom-capturer-on-android-with-libjingle可能相关,尽管我没有使用 libjingle 库,仅使用本机 WebRTC Android 包。
类似问题/文章:
-
适用于 iOS 平台 https://stackoverflow.com/questions/49493923/how-to-custom-webrtc-video-source但不幸的是我无法帮助回答。
- 适用于本机 C++ 平台 https://stackoverflow.com/questions/49131317/custom-video-capture-native-webrtc
- 关于本机实现的文章 https://sourcey.com/articles/webrtc-custom-opencv-video-capture
此问题有两种可能的解决方案:
- 实施定制
VideoCapturer
并创造VideoFrame
using byte[]
流数据输入onReceive
处理程序。实际上有一个很好的例子文件视频采集器 https://source.chromium.org/chromium/chromium/src/+/master:third_party/webrtc/sdk/android/api/org/webrtc/FileVideoCapturer.java,它实现了VideoCapturer
.
- 简单构造
VideoFrame
from NV21缓冲器 https://source.chromium.org/chromium/chromium/src/+/master:third_party/webrtc/sdk/android/src/java/org/webrtc/NV21Buffer.java,它是根据我们的字节数组流数据创建的。然后我们只需要使用我们之前创建的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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)