将音频流传输到Android中的http-post

时间:2013-06-27 15:02:41

标签: android audio-streaming audio-recording

我正在尝试

  1. 从Android设备录制语音,
  2. 将数据编码为某些音频编码(M4A,FLAC,Ogg)
  3. 流将其上传到我的服务器(chunked http post) - 正在进行录制。
  4. 任何想法如何实现这些?


    我尝试使用Android的MediaRecorder(记录音频,编码并保存到文件),并使用Android的HttpClient和InputStreamEntity,它允许从输入流上传数据。我使用https://github.com/Teaonly/android-eye/blob/master/src/teaonly/droideye/StreamingLoop.java中的“StreamingLoop”将输出文件描述符连接到inputStream,因此我可以将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 个答案:

答案 0 :(得分:2)

你可以使用MediaRecorder。 MediaRecorder的setOutputFile函数可以获取文件描述符。幸运的是,Android允许您从Socket获取文件描述符。请阅读this post以获取代码和详细信息。

正如前面提到的帖子所提到的,你可以控制流,这意味着你可以将它存储在缓冲区中,并可能将其传递给ChunkedOutputStream。这甚至允许您在录制时动态传输音频,如果您愿意的话。

如果使用LocalSocket而不是Socket,则可以通过在LocalSocket实例上调用getFileDescriptor直接获取fileDescriptor。

答案 1 :(得分:2)

使用Audiorecord类而非mediaRecorder。前者的API使您可以直接访问支持麦克风的缓冲区。您可以控制从缓冲区写入流的处理程序(如http chunked-encoding连接)。这将处理您的流媒体要求。

使用audioRecord查看git项目...

https://github.com/Audioboo/audioboo-android?source=c

请参阅class = FLACRecorder.run(),其中它读取AudioRecord缓冲区并将其写入编码器(FLAC)。如果你想传输flac编码的字节,你可以使用这个应用程序,获取编码器下游的字节并将其写入http连接,就像在这个类中一样。

答案 2 :(得分:1)

在StreamingLoop上查看时我很困惑:您是使用StreamingLoop还是使用HttpClient上传流?

如果您真的使用HttpClient,可以使用java.io.PipedReaderjava.io.PipedWriter轻松连接两个流。

比你配置你的MediaRecorder写入PipedWriter和你的HttpClient来读取你的PipedReader。两者都必须在不同的线程上运行。