Потоковое аудио и видео с Android на ПК / в Интернете. - PullRequest
6 голосов
/ 28 июля 2011

Я недавно новичок в Android SDK, и главная цель этого проекта - создать приложение, очень похожее на Ustream или Qik (да, я не знаю лучшую идею для новичка). Мне нужно передавать потоковое аудио и видео в Интернет. Там будет видеосервер, скорее всего, использующий Wowza, который обрабатывает видео в правильном формате.

Из того, что я нашел до сих пор, мне нужно использовать MediaRecorder Android с камерой в качестве источника и направить вывод на сервер. Это имеет смысл для меня, но я не знаю точно, как это сделать. Кто-нибудь может дать мне толчок в правильном направлении? Я просмотрел пример по адресу "http://ipcamera -for-android.googlecode.com / svn / trunk", но это оказалось гораздо сложнее, чем необходимо для того, что мне нужно сделать, и я не смог заставить его работать в затмении, чтобы проверить это в любом случае.

Ответы [ 2 ]

9 голосов
/ 04 августа 2011

Это не просто, но возможно.

MediaRecorder API предполагает, что вывод представляет собой файл произвольного доступа, то есть он может отправляться назад и назад для записи файла-контейнера mp4 (или другого). Как вы можете видеть в ipcamera-for-android, выходной файл направляется в сокет, который не является произвольным доступом. Этот факт затрудняет анализ исходящего потока, поскольку API MediaRecorder будет «записывать» некоторые данные, такие как fps, sps / pps (на h264) и т. Д., Только когда запись завершена. API попытается выполнить поиск в начале потока (там, где существует заголовок файла), но это не удастся, поскольку поток отправляется в сокет, а не в файл.

Использование ipcamera-for-android - хороший пример, если я правильно помню, перед потоковой передачей записывает видео в файл, открывает заголовок и получает оттуда все, что нужно, затем начинает запись в сокет. и использует данные, взятые из заголовка для анализа потока.

Вам также понадобятся некоторые базовые знания при разборе mp4 (или другого файлового контейнера, который вы хотите использовать) для захвата кадров. Вы можете сделать это либо на устройстве, либо на стороне сервера.

Вот хорошее начало для записи потока в сокет: Учебник

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

Посмотрите также здесь, чтобы увидеть, как направить выходной поток в поток, который можно отправить на сервер: MediaRecorder Вопрос

0 голосов
/ 10 марта 2013

SipDroid делает именно то, что вам нужно.

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

В основном это сводится к следующему (упрощенный код):

// Create a MediaRecorder
MediaRecorder mr = new MediaRecorder();
// (Initialize mr as usual)
// Create a LocalServerSocket
LocalServerSocket lss = new LocalServerSocket("foobar");
// Connect both end of this socket
LocalSocket sender = lss.accept();
LocalSocket receiver = new LocalSocket();
receiver.connect(new LocalSocketAddress("foobar"));
// Set the output of the MediaRecorder to the sender socket file descriptor
mr.setOutputFile(sender.getFileDescriptor());
// Start the video recording:
mr.start();
// Launch a background thread that will loop, 
// reading from the receiver socket,
// and creating a RTP packet out of read data.
RtpSocket rtpSocket = new RtpSocket();
InputStream in = receiver.getInputStream();
while(true) {
    fis.read(buffer, ...);
    // Here some data manipulation on the received buffer ...
    RtpPacket rtp = new RtpPacket(buffer, ...);
    rtpSocket.send(rtpPacket);
}

Реализация классов RtpPacket и RtpSocket (довольно просто), и точный код, который манипулирует контентом видеопотока, можно найтив проекте SipDroid (особенно VideoCamera.java).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...