Это может быть довольно интересная тема для людей, которые заинтересованы в оживлении от вашего устройства до веб-сервера . (Первичный Android / Java) Наконец-то я нашел способ, как жить с камеры моего устройства на мой веб-сервер (веб-сайт). В 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
Мне кажется, что HTTP-публикация, вероятно, не является хорошим способом для потоковой передачи видео на ваш сервер. Другие люди играли с потоковой трансляцией, и они использовали сокет для трансляции потоковых видеопотоков и аудиопотоков на свои серверы.
Я думал, что это увлекательно – вот ссылка.
Но парень также разместил образец частичного кода –
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, и они довольно интенсивны в работе).
Люди сообщают, что это работает, но я не тестировал. В любом случае, надеюсь, это полезно.
Вы отправляете весь снимок каждый раз? Почему бы вам не попробовать использовать некоторые методы сжатия видео, например, вместо отправки полного изображения каждый раз, когда вы отправляете сжатую версию (может быть, diff или что-то в этом роде), а на сервере вы создаете изображение на основе вашего последнего изображения и только что полученные данные. Я думаю, что все видеокодеки делают это, вы можете попробовать посмотреть некоторые из открытых спецификаций кодеков, чтобы получить некоторые идеи.
Об аудио. Я бы послал аудиопоток разделен, и они синхронизируют его с потоком видео на основе того, какой видеокадр мы показываем прямо сейчас.
В принципе, я постараюсь максимально приблизить потоковое вещание к тому, как работает реальная потоковая передача видео. Возможно, вы могли бы заглянуть в ffmpeg, у ffmpeg есть сервер rtsp, если вы могли бы создать это для android, вы бы упростили свою работу.
Примечание. Я не разработчик Android.
Из того, что вы сказали, похоже, что вы просто делаете снимок вместо реальной потоковой передачи. Если вы беспокоитесь о пропускной способности, используйте более низкое разрешение. Точно как это сделать в android я не уверен
Я думаю, что если в потоковых классах встроены потоки, вы сможете получить как поток видео, так и аудиопоток. Не выполняйте локальное перекодирование (ваш raw2jpg () считается транскодированием), поскольку он может использовать слишком большую вычислительную мощность. Просто возьмите поток, спустите его и отправьте на свой сервер.
РЕДАКТИРОВАТЬ:
Некоторые ссылки, чтобы вы начали
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