在Android上使用OpenSL ES通过套接字通信stream式传输MP3audio

我试图通过接入点将Android手机中的MP3stream式传输到另一款使用WiFi的Android手机。 问题是,OpenSL ES似乎只支持PCMaudio缓冲区作为源(除非使用URI)。 在发送之前,我并不是在“主”端解码一个潜在的巨大文件,而是希望让“客户端”将MP3解码成PCM。 请记住,这必须发生在文件stream,而不是简单地发送整个文件,然后解码。 有什么办法可以使用OpenSL ES来完成这个任务吗? AudioTrack? 这似乎是一个相当普遍的要求。

Solutions Collecting From Web of "在Android上使用OpenSL ES通过套接字通信stream式传输MP3audio"

你是正确的,opensl似乎不采取与MP3源简单的缓冲区队列。 这就是说,你应该可以使用SLDataLocator_URI来代替。 现在,我知道你开始时没有完整的文件(因为你正在stream媒体),但是有一个办法可以解决这个问题。 如果你创build一个空文件,并将其用作opensl URI播放器的源代码,那么一切都应该起作用。 当你得到的数据(MP3文件的位),只需将这些数据添加到您创build的空文件。 您可以让OpenSL在完成将数据附加到该文件之后开始播放。

创build一个空文件:

RandomAccessFile raf = new RandomAccessFile(new File(mFileUri), "rw"); raf.setLength(audioFileSize); 

创build您的audio源为:

 SLDataLocator_URI loc_uri = {SL_DATALOCATOR_URI, (SLchar *) fileLoc}; SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED}; SLDataSource audioSrc = {&loc_uri, &format_mime}; 

加载缓冲区:

 for (int i = 0; i < BUFFER_COUNT; i++) { // get byte[] data from stream raf.seek(i*Constants.BUFFER_SIZE); raf.write(data); } 

随时用OpenSL开始播放audio,然后继续加载缓冲区。 只要你在stream媒体过程中保持领先,你应该没问题。

你必须使用opensl。 MediaCodec(在Android 4.2中可用)可以将mp3解码成可传送到AudioTrack的PCM块。

你有没有尝试过维克托·拉扎里尼的OpenSL ES的audio编程示例http://audioprograming.wordpress.com/2012/10/29/lock-free-audio-io-with-opensl-es-on-android/

它提供了很好的基于http://mobilepearls.com/labs/native-android-api/ndk/docs/opensles/