Прямая трансляция видео с одного телефона Android на другой через Wi-Fi

115

Я уже несколько дней искал в Интернете, как реализовать функцию потоковой передачи видео с телефона Android на другой телефон Android через соединение Wi-Fi, но я не нашел ничего полезного. Я посмотрел на разработчиков Android в поисках примеров кода, stackoverflow, google, android-блогов, но ничего. Все, что я могу найти, - это какие-то решения для потоковой передачи с телефона на рабочий стол или с рабочего стола на телефон, но ничего, что я могу позаимствовать в своей реализации.

Мне нужно управлять роботом с помощью arduino ADK, поэтому я использую 2 телефона, один из которых будет установлен на роботе, а другой будет получать видеопоток от робота. Я говорю об этом, потому что стараюсь добиться наименьшей задержки между временем трансляции и временем просмотра.

Я пишу 2 приложения, одно главное приложение для управления роботом (с портативного телефона), которое будет управлять подчиненным приложением и получать поток, и второе подчиненное приложение, которое будет работать на телефоне с роботизированной привязкой, управляя двигателями / исполнительными механизмами. / потоковая передача в главное приложение. К сожалению, я не могу использовать сторонние приложения. Мне нужно интегрировать код видеопотока в мои 2 приложения.

Какие есть варианты для этого? Кроме того, это очень сложно сделать, потому что я никогда не работал с видеостримингом, но я неплохо справляюсь с разработкой как для Java, так и для Android. Как мне кодировать / декодировать поток, как мне инициировать соединение, мне нужно будет работать с UDP вместо TCP / IP? Я действительно не знаю, с чего начать, нигде нет образца кода. Я почти уверен, что этого можно достичь. Я просто не могу найти ничего полезного, чтобы начать движение в правильном направлении.

Я наткнулся на spydroid, но он использует VLC на рабочем столе, поэтому мне это не подходит.


РЕДАКТИРОВАТЬ: Проверьте блог Кэгни Моро . Он подробно рассказывает об этом.

androidu
источник
1
Можете ли вы поделиться своим проектом, я делаю то же самое, но потоковое видео между Android и рабочим столом (WebClient) ... Я думал о веб-сокетах html5 +, но у меня много проблем ...
Buksy
1
Я разрабатываю такое решение, которое на 80% совпадает с тем, что вы пытаетесь сделать. Вам необходимо настроить сервер VOIP, а затем создать клиентов для этого VOIP, которые будут передавать ваш голос и видео. Я тоже его ищу. если кто-нибудь знает, дайте мне знать.
AZ_
1
адрес электронной почты указан в моем профиле
AZ_
1
Посмотрите мой проект. Все на java и подробно объяснено cagneymoreau.com/stream-video-android
cagney
1
спасибо Я тоже работаю над роботом. Приколы
Кэгни

Ответы:

55

Если вам не нужны функции записи и воспроизведения в вашем приложении, разумным выбором будет использование готового потокового приложения и проигрывателя.

Однако, если вам нужно, чтобы они были в вашем приложении, вам нужно будет изучить MediaRecorder API (для приложения сервера / камеры) и 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-адресом файла, для (б) дать ему URL-адрес http, указывающий на ваш прокси.

Смотрите также:

Потоковая передача видео в реальном времени с телефона на телефон с помощью разъема fd

MediaPlayer заикается при запуске воспроизведения mp3

Алекс I
источник
2
Привет, Алекс, есть ли у вас опыт отправки локального сохраненного аудиофайла с телефона Android через RTP?
B770
привет, не могли бы вы прислать мне его полный проект?
Умар Асгар
1
не могли бы вы опубликовать свой полный проект?
Яжини Муругайя
какой из них является серверным и клиентским
Яжини Муругайя
1
@AhmedHamdy Действительно: на уровне API 23 (Android 6.0) вы можете использовать setDataSource(MediaDataSource)вместо FileDescriptor. Внедрение MediaDataSourceпозволит вам выполнять чтение и буферизацию по сети без записи во временный файл.
Alex I
9

Однажды я работал над чем-то подобным, но отправить видео и воспроизвести его в реальном времени - это действительно сложная вещь. Я предлагаю вам работать только с PNG. В моей реализации я захватил PNG с помощью главной камеры, а затем отправил их по сети клиенту, который отобразит изображение сразу после его получения и запросит следующее изображение с хоста. Поскольку у вас есть Wi-Fi, связь будет достаточно быстрой, чтобы получать около 8-10 изображений в секунду (только приблизительное значение, я работал с Bluetooth). Таким образом, это будет выглядеть как непрерывное видео, но с гораздо меньшими усилиями. Для связи вы можете использовать сокеты UDP (более быстрые и менее сложные) или DLNA (не знаю, как это работает).

Arveen
источник
Да, это было моим последним средством. Спасибо за ответ!
androidu
3
Конечно, поток jpeg будет более эффективным, чем поток png?
stealthcopter
Я просто предлагал использовать изображение, вы можете использовать любой формат, который пожелаете
Арвин
@krossreg> не могли бы вы вставить образец кода для того, что вы предлагаете?
Джаспер
8

Вы можете использовать IP-веб-камеру или, возможно, использовать DLNA. Например, устройства Samsung поставляются с приложением AllShare, которое может совместно использовать устройства с поддержкой DLNA в сети и получать к ним доступ. Я думаю, что IP-веб-камера - ваш лучший выбор. Вы должны иметь возможность открывать поток, который он создает, с помощью проигрывателя MX Video или чего-то подобного.

ldam
источник
2
Я пишу 2 приложения, одно главное приложение для управления роботом (с портативного телефона) и для просмотра того, что видит робот, и второе подчиненное приложение, которое будет работать на телефоне с привязанным к роботу, управляя двигателями / исполнительными механизмами / потоковой передачей. К сожалению, я не могу использовать сторонние приложения. Мне нужно интегрировать код видеопотока в мои 2 приложения.
androidu
Возможно, вы можете провести небольшое исследование спецификации DLNA и попытаться создать приложение, использующее его для себя, или, возможно, написать разработчику IP Webcam и попросить некоторую помощь.
ldam
1
Обратное проектирование? : P
mgibson 04
Да, думаю, у меня нет другого выбора.
androidu
5

Вы можете проверить Android VLC, который может транслировать и воспроизводить видео, если вы хотите узнать больше, вы можете проверить их GIT, чтобы проанализировать, что они делают. Удачи!

Рикардо Ортега Маганья
источник
3
Я изучаю Android VLC. Не могли бы вы рассказать мне, как использовать его для потоковой передачи видео?
user1914692 07