5

我试着

  1. 从 Android 设备录制语音,
  2. 将数据编码为某种音频编码(M4A、FLAC、Ogg)
  3. 流将其上传到我的服务器(分块 http 帖子) - 在录制过程中。

任何想法如何实现这些?


我尝试使用 Android MediaRecorder (它记录音频、对其进行编码并保存到文件)并将 AndroidHttpClient与 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 或如何调试的不同方法的任何想法?

4

3 回答 3

2

您可以为此使用 MediaRecorder。MediaRecorder的setOutputFile函数可以采用文件描述符。幸运的是,Android 允许您从 Socket 获取文件描述符。阅读这篇文章以获取代码和详细信息。

正如前面链接的帖子所提到的,您将可以控制流,这意味着您可以将其存储在缓冲区中,也可以将其传递给ChunkedOutputStream。如果您愿意,这甚至允许您在录制时即时流式传输音频。

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

于 2013-07-04T05:48:28.803 回答
2

使用 Audiorecord 类而不是 mediaRecorder。前者的 API 使您可以直接访问支持麦克风的缓冲区。您可以控制从缓冲区写入流的处理程序(如在 http 分块编码连接中)。这将处理您的流媒体需求。

使用 audioRecord 查看 git proj...

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

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

于 2013-07-06T20:57:35.177 回答
1

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

如果你真的用 HttpClient 来做,你可以很容易地用java.io.PipedReader和连接两个流java.io.PipedWriter

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

于 2013-07-01T12:47:42.200 回答