Подтвердить что ты не робот

Прямая трансляция Тема

Это может быть довольно интересная тема для людей, которые заинтересованы в оживлении от вашего устройства до веб-сервера. (Первичный Android/Java) Я, наконец, нашел способ, как livestream с моей камеры устройства на мой веб-сервер (веб-сайт). В Wi-Fi сети требуется ок. 1 кадр/секунда для отображения в сети Wi-Fi, а также работает в сети EDGE/3G. В этом вопросе/вопросе я хочу обсудить новые методы, улучшения, идеи о том, как жить, как я поделюсь с вами (коды тоже оценены).

Мой код повторно принимает снимок из предварительного просмотра камеры с помощью setOneShotPreviewCallback() для вызова onPreviewFrame(). Кадр поставляется в формате YUV, поэтому raw2jpg() преобразует его в 32-битный ARGB для jpeg-кодировщика. NV21 - плоский формат YUV.

getPicture() вызывается приложением и создает данные jpeg для изображения в массиве private byte mCurrentFrame и возвращает этот массив.

После этого byteArray mCurrentFrame получает Base64Encoded и отправляет на мой веб-сервер в методе HTTP POST вместе со строковым значением Base64 и собственным кодом идентификатора, чтобы люди не могли также отправить ему другое изображение. На веб-сервере он снова декодируется и помещается в файл test.jpg. PHP и Javascript работают на веб-сервере. PHP получает метод POST, и JavaScript перезагружает изображение каждые 750 секунд. Это в основном, как это работает.

Теперь меня очень интересуют ваши идеи, улучшения и другие вещи, которые вы хотели бы добавить/спросить. Вот некоторые из моих вопросов:

1) Какой был бы лучший способ для потокового вещания с аудио? Запись видео или мой метод + Запись звука?

2) Как бы вы приблизились к потоку записи видео?

3) Как вы будете передавать аудио на веб-сервер? (Основная цель) (с Java, PHP и JavaScript)

4) Я также планирую добавить типичные функции трансляции в реальном времени в i, например. когда появляется знаменитый человек, у вас может быть возможность показать свое имя, пока вы живете в прямом эфире, или просто добавьте изображение из своей sd-директории в ваш личный поток. Не могли бы вы также декодировать его и наложить изображение или каким-либо образом поместить изображение в ваш livestream?

Этот вопрос в первую очередь относится к вопросам, поэтому, пожалуйста, это может быть отличной помощью для некоторых людей здесь. Поэтому я добавил щедрость 50 (woot!) Репутации.

С уважением, XverhelstX

4b9b3361

Ответ 1

Мне кажется, что HTTP-публикация, вероятно, не очень хороший способ транслировать потоковое видео на ваш сервер. Другие люди играли с потоковой трансляцией, и они использовали сокет для трансляции потоковых видеопотоков и аудиопотоков на свои серверы.

Я думал, что это было захватывающе - вот ссылка.

http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system

Но парень также разместил образец частичного кода -

String hostname = "your.host.name";
int port = 1234;

Socket socket = new Socket(InetAddress.getByName(hostname), port);

ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);

MediaRecorder recorder = new MediaRecorder();

// Additional MediaRecorder setup (output format ... etc.) omitted

recorder.setOutputFile(pfd.getFileDescriptor());

recorder.prepare();

recorder.start();

Класс, о котором я не знал, это ParcelFileDescriptor - который создает файл в файловой системе Android, который фактически является каналом для сокета, - поэтому все, что записывается в файл, транслируется через Интернет на удаленный сервер. Розетки - это правильный способ заниматься этим, потому что они позволяют вам непрерывно отправлять данные, пока ваша запись не будет завершена без повторной отправки заголовков снова и снова.

Я думаю, что это круто об этом методе, так это то, что он буквально выводит результат MediaRecorder (который будет представлять собой кодированный видеопоток) и перекачивает его через сокет на его сервер. Затем он может просто сохранить данные, поступающие через сокет. Без кадровой перестройки, без обработки (Android SDK не очень хорошо показывает кодировщики в SDK, и они довольно интенсивно работают).

Люди сообщают, что он работает, но я не тестировал. В любом случае, надеюсь, что это будет полезно.

Ответ 2

Вы отправляете весь снимок каждый раз? Почему бы вам не попробовать использовать некоторые методы сжатия видео, например, вместо отправки полного изображения каждый раз, когда вы отправляете сжатую версию (может быть, diff или что-то в этом роде), а на сервере вы создаете изображение на основе вашего последнего изображения и только что полученные данные. Я думаю, что все видеокодеки делают это, вы можете попробовать посмотреть некоторые из открытых спецификаций кодеков, чтобы получить некоторые идеи.

Об аудио. Я бы послал аудиопоток разделен, и они синхронизируют его с потоком видео на основе того, какой видеокадр мы показываем прямо сейчас.

В принципе, я постараюсь максимально приблизить потоковое вещание к тому, как работает реальная потоковая передача видео. Возможно, вы могли бы заглянуть в ffmpeg, у ffmpeg есть rtsp-сервер, если вы могли бы создать это для android, вы упростили бы свою работу.

Ответ 3

Примечание. Я не разработчик Android.

Из того, что вы сказали, кажется, что вы просто делаете снимок вместо реальной потоковой передачи. Если вы беспокоитесь о пропускной способности, используйте более низкое разрешение. Точно как это сделать в android я не уверен

Я думаю, что если бы встроенные потоковые классы вы могли получить как поток видео, так и поток аудио. Не выполняйте локальное перекодирование (ваш raw2jpg() считается транскодированием), поскольку он может использовать слишком большую вычислительную мощность. Просто возьмите поток, спустите его и отправьте на свой сервер.


EDIT:

Некоторые ссылки, чтобы начать работу

  • Интересный проект, который превращает телефон Android в IP-камеру. Вы можете копаться вокруг кода, чтобы выяснить, как они получают поток камеры.
  • Вопрос SO по этой теме

Ответ 4

1) Какой был бы лучший способ для потокового вещания с аудио? Запись видео или мой метод + Запись звука?

This really depends on your view of "best". If you are looking for resources and not the quality, then your way is really good. Otherwise, you should use a native streaming mechanism or maybe implement a video streaming technique to stream and encode video.

3) Как вы будете передавать аудио на веб-сервер? (Основная цель) (С Java, PHP и JavaScript)

I suggest that you stick to MediaRecorder because it really does what your doing in a good way. Still try to find a way to get the stream in order to send in your way as files are not the best choice although you could stick to files and send small files in a timely manner. In this way you could put a bigger portion of the load on the server rather than the client.

4) Я также планирую добавить типичные функции трансляции в реальном времени в i, например. когда появляется знаменитый человек, у вас может быть возможность показать свое имя, пока вы живете в прямом эфире, или просто добавьте изображение из своей sd-директории в ваш личный поток. Не могли бы вы также декодировать его и наложить изображение или каким-либо образом поместить изображение в ваш livestream?

Do not even try to put it in your livestream. With your php server, you have more capabilities to send this info alone with certain tag and let the server do the processing or maybe integration of these with the video