Совместное использование экрана между устройствами с помощью Media Projection API

Я разрабатываю приложение, которое позволяет делиться экранами с другими приложениями.

Я использовал для этого Media projection API. Я также использовал MediaMuxer для объединения аудио и видео выходов для совместного использования экрана.

Я знаю, что API-интерфейсы Media Projection используются для записи экрана, но все, что я хочу, - это показать экран во время записи.

Для этого я модифицировал метод writeSampleData класса MediaMuxer для отправки байтов через сокет на другое устройство по сети.

Ниже приведен код для этого:

OutputStream outStream;

outStream = ScreenRecordingActivity.getInstance (). socket.getOutputStream ();

void writeSampleData(final int trackIndex, final ByteBuffer byteBuf, final MediaCodec.BufferInfo bufferInfo) {
    if (mStatredCount > 0) {
        mMediaMuxer.writeSampleData(trackIndex, byteBuf, bufferInfo);

        if (bufferInfo.size != 0) {

            byteBuf.position(bufferInfo.offset);
            byteBuf.limit(bufferInfo.offset + bufferInfo.size);

            if (outStream != null) {

                try {

                    byte[] bytes = new byte[byteBuf.remaining()];
                    byteBuf.get(bytes);

                    //Send the data
                    outStream.write(bytes);
                    outStream.flush();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Байты успешно передаются через сокет, и я также могу получать эти байты на стороне получателя.

Ниже приведен код для получения байтов на стороне получателя:

private class SocketThread implements Runnable {
    @Override
    public void run() {

        Socket socket;
        try {
            serverSocket = new ServerSocket(SERVER_PORT);
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (null != serverSocket) {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    socket = serverSocket.accept();
                    CommunicationThread commThread = new CommunicationThread(socket);
                    new Thread(commThread).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    class CommunicationThread implements Runnable {

        InputStream in;
        DataInputStream dis;

        public CommunicationThread(Socket clientSocket) {


            updateMessage("Server Started...");
        }

        public void run() {           

            while (!Thread.currentThread().isInterrupted()) {

                try {                       

                    byte[] data = new byte[512];               

                } catch (Exception e) {                    

                    e.printStackTrace();

                    try {
                        fos.close();
                    } catch (Exception e1) {

                        e1.printStackTrace();
                    }
                }
            }
        }
    }
}

Я перешел по следующим ссылкам для совместного использования экрана:

Снимок экрана

средство записи экрана

Запись экрана с помощью mediaProjection

Я использовал код из приведенных выше примеров для создания приложения.

Все, что я хочу знать, это как обрабатывать байты в получателе. Как мне отформатировать эти байты для воспроизведения живого потока со стороны отправителя?

Следую ли я правильному подходу к отправке и получению байтовых данных?

Позволяет ли MediaProjection транслировать экран во время записи между приложениями?

Мы будем очень благодарны за любую помощь.


person Ankit Kamboj    schedule 07.06.2018    source источник
comment
API проекции мультимедиа работает в iOS с использованием собственного быстрого кода, есть ли возможность?   -  person Gangireddy Rami Reddy    schedule 27.05.2021


Ответы (1)


Обычно для потоковой передачи, включая демонстрацию экрана, аудио- и видеодорожки не мультиплексируются. Вместо этого каждый видеокадр и аудиосэмпл отправляются с использованием протокола, такого как RTP / RTSP, в котором каждый фрагмент данных обернут другими вещами, такими как временные метки.

Вы можете взглянуть на spyadroid, который является хорошей отправной точкой для потоковой передачи аудио и видео через RTSP. в браузер или VLC. Он передает поток данных с камеры и микрофона, но вы можете адаптировать его для своего собственного сценария использования.

Если вы хотите на данный момент использовать сокеты, вам нужно избавиться от MediaMuxer и отправлять кадры / сэмплы непосредственно из вывода Encoder с добавлением временных меток, по крайней мере, для синхронизации воспроизведения на стороне приемника. , после отправки CSD - при условии, что вы кодируете в формате h.264 - данные (SPS PPS, также известные как csd-0 и csd-1, которые вы можете получить, когда формат кодировщика изменен) на приемник Decoder, который можно настроить с выходной поверхностью для рендеринга вашего потока.

Некоторые дополнительные ссылки:

android-h264-stream-demo

RTMP Java Muxer для Android

RTSP

RTP

WebRTC

person E.Abdel    schedule 07.06.2018