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

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

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

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

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

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

Ответ 1

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

Если вам нужно, чтобы они были в вашем приложении, вам нужно будет изучить MediaRecorder API (для сервера /camera app) и 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();

К сожалению, mediaplayer имеет тенденцию не понравиться, поэтому у вас есть несколько вариантов: либо (a) сохранить данные из сокета в файл и (после того, как у вас есть бит данных) играть с медиапланером из файла, либо (b) сделать крошечный прокси-сервер http, который выполняется локально и может принимать запрос GET для медиаплеер, отвечать заголовками HTTP, а затем копировать данные с удаленного сервера на него. Для (a) вы создадите медиаплеер с файловым путем или файловым url, для (b) укажите URL-адрес http, указывающий на ваш прокси-сервер.

См. также:

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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