Android 上 WebRTC 的自定义视频源

2024-05-22

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

此问题有两种可能的解决方案:

  1. 实施定制VideoCapturer并创造VideoFrame using byte[]流数据输入onReceive处理程序。实际上有一个很好的例子文件视频采集器 https://source.chromium.org/chromium/chromium/src/+/master:third_party/webrtc/sdk/android/api/org/webrtc/FileVideoCapturer.java,它实现了VideoCapturer.
  2. 简单构造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(使用前将#替换为@)

Android 上 WebRTC 的自定义视频源 的相关文章

随机推荐