我正在尝试
任何想法如何实现这些?
我尝试使用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的不同方法的任何想法或如何调试它?
答案 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.PipedReader
和java.io.PipedWriter
轻松连接两个流。
比你配置你的MediaRecorder写入PipedWriter和你的HttpClient来读取你的PipedReader。两者都必须在不同的线程上运行。