потоковое аудио на http-post в Android
Я пытаюсь
- запись голоса с устройства Android,
- Закодируйте данные в виде некоторого аудиокодирования (M4A, FLAC, Ogg)
- потоковая загрузка на мой сервер (chunked http post) - пока запись продолжается.
Есть идеи, как их достичь ?
Я попробовал использовать Android MediaRecorder
(который записывает аудио, кодирует его и сохраняет в файл) и использовать Android HttpClient
с InputStreamEntity, который позволяет загружать данные с входа поток. Я использовал "StreamingLoop" от https://github.com/Teaonly/android-eye/blob/master/src/teaonly/droideye/StreamingLoop.java для подключения дескриптора выходного файла к входному потоку, чтобы я мог использовать выходные данные MediaRecorder для ввода HttpClient.
Однако это не удалось - когда я останавливаю запись, я получаю:
06-27 17:58:47.259: A/libc(6759): Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1), thread 6759
Который завершает работу приложения, и файл, который поступает на сервер, не может быть воспроизведен VLC, так что это дважды ошибка.
Любой идеи для другого метода выполнения требований 1..3 выше или как его отладить?
3 ответа:
Используйте класс Audiorecord, а не mediaRecorder. API для первого дает вам прямой доступ к буферу, поддерживающему микрофон. У вас есть контроль над обработчиком, который записывает из буфера в поток (как в HTTP-соединении с фрагментированным кодированием). Это будет обрабатывать ваши требования потоковой передачи.
Посмотрите на Git proj с помощью audioRecord...
Https://github.com/Audioboo/audioboo-android?source=c
Смотрите class=FLACRecorder.запустить (), где он читает осуществление аудиозаписи буфер и записывает его в кодер (FLAC). Если вы хотите передать поток flac-кодированных байтов , вы можете использовать это приложение, получить байты ниже кодера и записать их в http-соединение, как в этом классе.
Для этого можно использовать MediaRecorder. ФункцияsetOutputFile из MediaRecorder может принимать файловый дескриптор. К счастью, Android позволяет получить файловый дескриптор из сокета. Прочитайте этот пост для кода и деталей.
Как упоминалось в предыдущем посте, вы будете иметь контроль над потоком, что означает, что вы можете сохранить его в буфере и, возможно, передать его в ChunkedOutputStream. Это даже позволяет передавать аудио на лету, как вы записываете, если ты бы захотел.
Если вы используете LocalSocket вместо сокета, вы можете получить fileDescriptor напрямую, вызвав getFileDescriptor на экземпляре LocalSocket.
Когда я смотрю на StreamingLoop, я в замешательстве: вы загружаете поток с StreamingLoop или с HttpClient?
Если вы действительно делаете это с HttpClient, вы можете легко соединить два потока с помощью
java.io.PipedReader
и ещеjava.io.PipedWriter
.Чем вы настраиваете свой MediaRecorder для записи в PipedWriter и свой HttpClient для чтения из вашего PipedReader. Оба должны работать в разных потоках.