Відео в прямому ефірі з одного Android-телефону на інший через WiFi


115

Протягом днів я шукав в Інтернеті, як реалізувати функцію потокового відео з Android-телефону на інший телефон Android через Wi-Fi, але, здається, не можу знайти нічого корисного. Я дивився на андроїд розробників на зразок коду, stackoverflow, google, android blogs, але нічого. Все, що я можу знайти, - це якісь рішення «від телефону до настільного ПК» або «настільний телефон» для потокової передачі, але нічого, що я можу позичити в своїй реалізації.

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

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

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

Я наткнувся на шпидороїда, але він використовує VLC на робочому столі, так що це не добре для мене.


РЕДАКТУЙТЕ: Ознайомтесь із блогом Кенні Моро . Він розбирається в деталях щодо цього.


1
Чи можете ви поділитися своїм проектом, я роблю подібну річ, але потокове відео між android та desktop (WebClient) ... Я думав про html5 + websockets, але я стикаюся з багатьма проблемами ...
Buksy

1
Я розробляю таке рішення, яке на 80% те саме, що ви намагаєтесь зробити. Вам потрібно налаштувати сервер VOIP, а потім створити клієнтів для того VOIP, який передасть ваш голос та відео. Я також його шукаю. якщо хтось знає, будь ласка, дайте мені знати.
AZ_

1
електронний лист вказаний у моєму профілі
AZ_

1
Перевірте мій проект. Все в Java і детально пояснили cagneymoreau.com/stream-video-android
cagney

1
дякую, що я також працюю над роботом. Веселі речі
cagney

Відповіді:


55

Якщо вам не потрібна функція запису та відтворення у вашому додатку, розумний вибір використання поточного додатка для потокового передавання та програвача.

Якщо вам потрібно, щоб вони були у вашому додатку, вам доведеться заглянути 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();

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

Дивитися також:

Потокове відео в прямому ефірі з телефону на телефон за допомогою socket fd

MediaPlayer заїкається на початку відтворення mp3


2
Здрастуйте, Алекс, чи маєте ви досвід надсилання локального збереженого аудіофайлу з телефону Android через RTP?
B770

привіт, ви можете, будь ласка, надіслати мені повний проект цього?
Умар Асгар

1
чи можете ви опублікувати ваш повний проект?
Яжині Муругая

який серверний сокет і клієнтський сокет
Yazhini Murugaiya

1
@AhmedHamdy Дійсно: на рівні API 23 (Android 6.0) ви можете використовувати setDataSource(MediaDataSource)замість FileDescriptor. Реалізація MediaDataSourceдозволить вам робити власне читання в мережі та буферизацію, не записуючи у тимчасовий файл.
Олексій І

9

Я колись працював над чимось подібним, але надсилання відео та відтворення його в режимі реального часу - дійсно складна річ. Я пропоную вам працювати лише з PNG. У моєму здійсненні Що я зробив - це зйомка PNG за допомогою хост-камери, а потім надсилання їх по мережі клієнтові, який відображатиме зображення, як тільки отримано, і запитує наступне зображення від хоста. Оскільки ви перебуваєте на wifi, то спілкування буде досить швидким, щоб отримати близько 8-10 зображень за секунду (лише наближення, я працював над Bluetooth). Тож це буде виглядати як суцільне відео, але з набагато меншими зусиллями. Для спілкування ви можете використовувати розетки UDP (швидше і менш складні) або DLNA (не впевнені, як це працює).


Так, це буде моєю останньою інстанцією. Дякуємо за відгук!
androidu

3
Напевно потік jpeg був би більш ефективним, ніж потік png?
stealthcopter

Я просто пропонував використовувати зображення, ви можете використовувати будь-який
бажаний

@krossreg> чи можете ви вставити зразок коду для запропонованого вами?
Джаспер

8

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


2
Я пишу 2 додатки, один головний додаток для управління роботом (з кишенькового телефону) та для перегляду того, що бачить робот, і другий доданий підлеглий, який буде працювати на телефоні, пов'язаному з роботом, керуючи двигунами / приводами / потоковою передачею. На жаль, я не можу використовувати додатки сторонніх розробників. Мені потрібно інтегрувати код відеопотоку у свої 2 програми.
androidu

Можливо, ви можете зробити кілька досліджень на специфікацію DLNA і зробити статтю, щоб зробити додаток, використовуючи його для себе, або, можливо, надіслати електронною поштою розробника веб-камери IP і попросити допомоги.
ldam

1
Зворотний інженер це? : P
mgibson

Так, у мене немає іншого вибору, мабуть.
androidu

5

Ви можете перевірити андроїд VLC, на якому він може передавати та відтворювати відео, якщо ви хочете отримати більше інформації, ви можете перевірити їх GIT, щоб проаналізувати, що вони роблять. Удачі!


3
Я шукаю Android VLC. Скажіть, як це використовувати для передачі відео?
користувач1914692
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.