使用Androidstream式传输AACaudio

据我所知,如果将Android编码为MPEG-4或3GPP,Android将只播放AAC格式的audio

当它是本地的应用程序时,我能够播放编码为M4A的AACaudio,但从服务器获取时却失败。

下面的工作,因为m4a文件在res / raw目录本地保存。

MediaPlayer mp = MediaPlayer.create(this, R.raw.*file*); mp.start(); 

以下不起作用。 (但与MP3的)。

 Uri uri = Uri.parse("http://*example.com*/blah.m4a"); MediaPlayer mp = MediaPlayer.create(this, uri); mp.start(); 

任何人都可以说明为什么当m4aaudio文件不是本地时失败?

这是(一些)错误…

 ERROR/PlayerDriver(542): Command PLAYER_INIT completed with an error or info UNKNOWN PVMFStatus ERROR/MediaPlayer(769): error (200, -32) WARN/PlayerDriver(542): PVMFInfoErrorHandlingComplete DEBUG/MediaPlayer(769): create failed: DEBUG/MediaPlayer(769): java.io.IOException: Prepare failed.: status=0xC8 DEBUG/MediaPlayer(769): at android.media.MediaPlayer.prepare(Native Method) DEBUG/MediaPlayer(769): at android.media.MediaPlayer.create(MediaPlayer.java:530) DEBUG/MediaPlayer(769): at android.media.MediaPlayer.create(MediaPlayer.java:507) ... 

我的目标是SDK 1.6。

Solutions Collecting From Web of "使用Androidstream式传输AACaudio"

解决方法允许您从networking(和MP4和3GP等其他容器中的AAC文件)播放M4A文件。 它只是下载文件并从caching中播放。

 private File mediaFile; private void playAudio(String mediaUrl) { try { URLConnection cn = new URL(mediaUrl).openConnection(); InputStream is = cn.getInputStream(); // create file to store audio mediaFile = new File(this.getCacheDir(),"mediafile"); FileOutputStream fos = new FileOutputStream(mediaFile); byte buf[] = new byte[16 * 1024]; Log.i("FileOutputStream", "Download"); // write to file until complete do { int numread = is.read(buf); if (numread <= 0) break; fos.write(buf, 0, numread); } while (true); fos.flush(); fos.close(); Log.i("FileOutputStream", "Saved"); MediaPlayer mp = new MediaPlayer(); // create listener to tidy up after playback complete MediaPlayer.OnCompletionListener listener = new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { // free up media player mp.release(); Log.i("MediaPlayer.OnCompletionListener", "MediaPlayer Released"); } }; mp.setOnCompletionListener(listener); FileInputStream fis = new FileInputStream(mediaFile); // set mediaplayer data source to file descriptor of input stream mp.setDataSource(fis.getFD()); mp.prepare(); Log.i("MediaPlayer", "Start Player"); mp.start(); } catch (Exception e) { e.printStackTrace(); } } 

有一个开放源码的OpenMXPlayer ,演示了如何处理本地文件或在线/stream媒体源的audio。 它不仅支持AAC,还支持其他常用格式。

它背后的想法是使用Android 4.1中引入的MEdiaCodec API。

希望这为任何需要快速无忧audio播放器实现的人提供了一个很好的起点。

有一个免费的高级audio(AAC)解码器为Android 。 您可以使用这个帮助和指导,或使用多人课程播放aacaudio。 有一个示例应用程序和库,以帮助您理解

希望这可以帮助

这是在黑暗中的一个狂野的镜头,但我已经看到与Flash播放器类似的行为,它实际上忽略了文件名,只依赖于服务器发送的MIMEtypes。 任何想法是从example.com发送什么标题? 您可能想要尝试将blah.m4a包装在可以设置标题的页面中,然后对二进制数据进行stream式处理。 给这些types一个镜头,社区将欣赏什么工作的确认:

audio/ mpegaudio/ mp4aaudio/ mp4a-latmaudio/ aacaudio/ x-aac

我写了一篇关于我正在开发的音乐播放器的基于云的解决scheme的小博客。 它基于年轻的Android云服务(ACS)项目,目前尚不可用,但它仍然显示了使用基于云的转码来stream式传输任何媒体文件的潜在解决scheme。 看看: http : //positivelydisruptive.blogspot.com/2010/08/streaming-m4a-files-using-android-cloud.html

乔尔

我也尝试过,但我找不到解决scheme!

最后Google I / OI看到了一些帮助我的东西。 它是从MediaPlayer扩展并改进了很多东西! 看一看。

EXOPLAYER可以帮助你很多

检查这个例子的这个部分:

 private static final int BUFFER_SEGMENT_SIZE = 64 * 1024; private static final int BUFFER_SEGMENT_COUNT = 256; ... // String with the url of the radio you want to play String url = getRadioUrl(); Uri radioUri = Uri.parse(url); // Settings for exoPlayer Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE); String userAgent = Util.getUserAgent(context, "ExoPlayerDemo"); DataSource dataSource = new DefaultUriDataSource(context, null, userAgent); ExtractorSampleSource sampleSource = new ExtractorSampleSource( radioUri, dataSource, allocator, BUFFER_SEGMENT_SIZE * BUFFER_SEGMENT_COUNT); audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource); // Prepare ExoPlayer exoPlayer.prepare(audioRenderer); 

EXOPLAYER-我可以播放任何stream媒体(video和audio)!

让我知道如果你需要帮助实施它 ! 🙂

尝试 –

1) MP.prepareAsync()

2) onPrepared() { mp.start() }