Совместное использование экрана между устройствами с помощью Media Projection API - PullRequest
0 голосов
/ 07 июня 2018

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

Для этого я использовал 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();
                    }
                }
            }
        }
    }
}

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

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

screenrecorder

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

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

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

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

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

Любая помощь будет высоко оценена.

1 Ответ

0 голосов
/ 07 июня 2018

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

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

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

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

android-h264-stream-demo

RTMP Java Muxer для Android

RTSP

RTP

WebRTC

...