Прямая трансляция видео с одного телефона Android на другой через WiFi
Я уже несколько дней искал в Интернете, как реализовать функцию потоковой передачи видео с телефона Android на другой телефон Android через соединение WiFi, но я не могу найти ничего полезного. Я искал разработчиков Android для примера кода, stackru, Google, блоги Android, но ничего. Все, что я могу найти, - это какие-то решения от телефона к компьютеру или с компьютера на телефон для потоковой передачи, но ничего, что я могу позаимствовать в своей реализации.
Мне нужно управлять роботом с помощью Arduino ADK, поэтому я использую 2 телефона, один из которых будет установлен на роботе, а другой будет получать видеопоток от робота. Я упоминаю об этом, потому что я пытаюсь добиться наименьшей задержки между временем трансляции и временем просмотра.
Я пишу 2 приложения, одно главное приложение для управления роботом (с портативного телефона), которое будет управлять подчиненным приложением и получать поток, и второе подчиненное приложение, которое будет работать на телефоне, привязанном к роботу, управляя двигателями / исполнительными механизмами. / Потоковое в мастер приложение. Я не могу использовать сторонние приложения, к сожалению. Мне нужно интегрировать код видеопотока в мои 2 приложения.
Какие есть варианты для достижения этой цели? Кроме того, это очень трудно сделать, потому что я никогда не работал с видеопотоком, хотя я неплохо справляюсь как с Java, так и с Android. Как я должен кодировать / декодировать поток, как мне установить соединение, мне нужно будет работать с UDP вместо TCP/IP? Я действительно не знаю, с чего начать, без примера кода. Я уверен, что этого можно достичь. Я просто не могу найти ничего полезного, чтобы начать меня в правильном направлении.
Я наткнулся на Spydroid, но он использует VLC на рабочем столе, так что это не хорошо для меня.
РЕДАКТИРОВАТЬ: Проверьте блог Кэгни Моро. Он углубляется в детали реализации этого.
4 ответа
Если вам не нужны функции записи и воспроизведения в вашем приложении, разумным выбором будет использование готового потокового приложения и плеера.
Однако, если вам нужно, чтобы они были в вашем приложении, вам придется изучить API MediaRecorder (для приложения сервер / камера) и MediaPlayer (для приложения клиент / проигрыватель).
Быстрый пример кода для сервера:
// this is your network socket
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// this is the unofficially supported MPEG2TS format, suitable for streaming (Android 3.0+)
mMediaRecorder.setOutputFormat(8);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setOutputFile(pfd.getFileDescriptor());
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
mMediaRecorder.prepare();
mMediaRecorder.start();
На стороне игрока это немного сложно, вы можете попробовать это:
// this is your network socket, connected to the server
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(pfd.getFileDescriptor());
mMediaPlayer.prepare();
mMediaPlayer.start();
К сожалению, медиаплееру это не нравится, поэтому у вас есть несколько вариантов: либо (а) сохранить данные из сокета в файл и (после того, как у вас будет немного данных) поиграть с медиаплеером из файла, либо (б) сделать крошечный http прокси, который работает локально и может принимать GET-запрос медиаплеера, отвечать с заголовками HTTP, а затем копировать на него данные с удаленного сервера. Для (а) вы должны создать медиаплеер с путем к файлу или URL-адрес файла, для (б) дать ему http-ссылку, указывающую на ваш прокси.
Смотрите также:
Однажды я работал над чем-то вроде этого, но отправка видео и его воспроизведение в режиме реального времени - действительно сложная вещь. Я предлагаю вам работать только с PNG. В моей реализации я сделал захват PNG-изображений с помощью хост-камеры, а затем отправил их по сети клиенту, который отобразит изображение сразу после его получения и запросит следующее изображение с хоста. Поскольку вы работаете по Wi-Fi, связь будет достаточно быстрой, чтобы получать около 8-10 изображений в секунду (только для примера, я работал по Bluetooth). Так что это будет выглядеть как непрерывное видео, но с гораздо меньшими усилиями. Для связи вы можете использовать UDP-сокеты (быстрее и менее сложные) или DLNA (не уверен, как это работает).
Вы можете использовать IP-камеру или, возможно, использовать DLNA. Например, устройства Samsung поставляются с приложением под названием AllShare, которое может совместно использовать и получать доступ к устройствам с поддержкой DLNA в сети. Я думаю, что IP Webcam - ваш лучший выбор. Вы должны быть в состоянии открыть поток, который он создает, используя MX Video Player или что-то в этом роде.
Вы можете проверить Android VLC, он может передавать и воспроизводить видео, если вы хотите больше раздражать, вы можете проверить их GIT, чтобы проанализировать, что они делают. Удачи!