Пользовательский источник видео для WebRT C на Android - PullRequest
3 голосов
/ 11 апреля 2020

Обзор

Я бы хотел использовать пользовательский источник видео для прямой трансляции видео через реализацию WebRT C Android. Если я правильно понимаю, существующая реализация поддерживает только переднюю и заднюю камеры на телефонах Android. В этом сценарии используются следующие классы:

В настоящее время для использования фронтальной камеры на телефоне 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?

Существующие вопросы

Этот вопрос может быть актуальным, хотя я Я не использую библиотеку libjingle, только собственный пакет WebRT C Android.

Похожие вопросы / статьи:

1 Ответ

2 голосов
/ 27 апреля 2020

Существует два возможных решения этой проблемы:

  1. Реализация пользовательских VideoCapturer и создание VideoFrame с использованием byte[] потоковых данных в обработчике onReceive. На самом деле существует очень хороший пример FileVideoCapturer , который реализует VideoCapturer.
  2. Просто создайте VideoFrame из NV21Buffer , который создается из нашего потока байтового массива данные. Тогда нам нужно только использовать ранее созданный 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();
}
...