Android MediaPlayer 在自定义音频流应用程序中工作正常,直到 Android 2.1 但在更高版本中不行 [英] Android MediaPlayer works fine in Custom audio Streaming application up to Android 2.1 but not in higher versions

查看:24
本文介绍了Android MediaPlayer 在自定义音频流应用程序中工作正常,直到 Android 2.1 但在更高版本中不行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Android 2.2 MediaPlayer 与一个 SHOUTcast URL 一起工作正常,但与另一个不兼容

我需要从外部 URL 播放音频文件(shoutcast 流).目前音频文件是增量下载的一旦我们在手机本地临时存储中获得足够的音频,就会播放.我正在使用 StreamingMediaPlayer 类.

检查这段代码:

 private MediaPlayer createMediaPlayer(File mediaFile)抛出 IOException {MediaPlayer mPlayer = new MediaPlayer();//mediaFile 示例 =/data/data/package/cache/playingMedia0.datFileInputStream fis = new FileInputStream(mediaFile);mPlayer.setDataSource(fis.getFD());mPlayer.prepare();返回 mPlayer;}

当前状态:

1- 从 Android 1.6 到 2.1 都可以正常工作,但在 Android 2.2 等更高版本中则不行.

2- "mPlayer.setDataSource(fis.getFD())" 是引发错误的行.

3- 错误是无法创建媒体播放器"

尝试过的其他解决方案:

我尝试了以下替代解决方案,但到目前为止没有任何效果.

Android 2.2 MediaPlayer 与一个 SHOUTcast URL 一起工作正常,但与另一个不兼容

我在找什么?

我的目标是让代码能够在 Android 2.1 和 Android 2.1 上运行.更高.

这里也讨论了这个问题:

1- 不一致的 2.2 媒体播放器行为>

2- 在 2.2 中用于流式传输 Shoutcast 流中断的 android 代码

3- 这个网站上的很多问题也讨论了这个问题,但我找不到答案.

4- markmail.org

LogCat 跟踪:

无法创建媒体播放器复制缓冲内容时出错.java.lang.NullPointerExceptioncom.ms.iradio.StreamingMediaPlayer.startMediaPlayer(StreamingMediaPlayer.java:251)com.ms.iradio.StreamingMediaPlayer.access$2(StreamingMediaPlayer.java:221)com.ms.iradio.StreamingMediaPlayer$2.run(StreamingMediaPlayer.java:204)android.os.Handler.handleCallback(Handler.java:587)android.os.Handler.dispatchMessage(Handler.java:92)android.os.Looper.loop(Looper.java:123)android.app.ActivityThread.main(ActivityThread.java:3683)java.lang.reflect.Method.invokeNative(原生方法)java.lang.reflect.Method.invoke(Method.java:507)com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)dalvik.system.NativeStart.main(本机方法)

解决方案

StreamingMediaPlayer 类使用双缓冲技术来绕过 Android 1.2 之前版本中的限制.Android 操作系统的所有生产版本都包含支持流媒体的 MediaPlayer(1).我建议这样做而不是使用这种双缓冲技术来解决这个问题.

Android OS 2.2 用 FrightCast 播放器替换了旧的媒体播放器代码,在这种情况下它的行为可能有所不同.

堆栈跟踪中的行号不会映射到您链接到的文件,因此我假设您实际使用的是不同的版本.我会猜测 NullPointerException 是由 MediaPlayer 报告的,但 FileInputStream 和返回的 FileDescriptor 都没有报告可以是 null.

(1) 在 2.2 版之前,媒体播放器无法识别响应中带有ICY/1.1"版本标头的 ShoutCast 流.通过创建一个用HTTP/1.1"替换它的代理,你可以解决这个问题.请参阅 此处为 StreamProxy 类 示例.

EDIT:

Android 2.2 MediaPlayer is working fine with one SHOUTcast URL but not with the other one

I need to play audio files from external URLs(shoutcast stream). Currently the audio files are downloaded incrementally & are played as soon as we get enough audio in phone local temporary storage. i am using the StreamingMediaPlayer class.

Check this piece of code:

    private MediaPlayer createMediaPlayer(File mediaFile)
            throws IOException {
        MediaPlayer mPlayer = new MediaPlayer();
        //example of mediaFile =/data/data/package/cache/playingMedia0.dat
        FileInputStream fis = new FileInputStream(mediaFile);
        mPlayer.setDataSource(fis.getFD());
        mPlayer.prepare();
        return mPlayer;
    }

Current status:

1- It works fine from Android 1.6 to 2.1 but not in the higher versions like Android 2.2.

2- The "mPlayer.setDataSource(fis.getFD())" is the line which throws the error.

3- The error is "Unable to to create media player"

Other Solution tried:

I tried below alternate solution but nothing worked so far.

Android 2.2 MediaPlayer is working fine with one SHOUTcast URL but not with the other one

What i am looking for?

My goal is to have a peace of code which can work on Android 2.1 & higher.

This issue is also discussed here:

1- Inconsistent 2.2 Media Player Behavior

2- android code for streaming shoutcast stream breaks in 2.2

3- This issue is also discussed in a lot of questions on this site, but i found the answer no where.

4- markmail.org

LogCat trace:

Unable to to create media player
Error copying buffered conent.
java.lang.NullPointerException
com.ms.iradio.StreamingMediaPlayer.startMediaPlayer(StreamingMediaPlayer.java:251)
com.ms.iradio.StreamingMediaPlayer.access$2(StreamingMediaPlayer.java:221)
com.ms.iradio.StreamingMediaPlayer$2.run(StreamingMediaPlayer.java:204)
android.os.Handler.handleCallback(Handler.java:587)
android.os.Handler.dispatchMessage(Handler.java:92)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:3683)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:507)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
dalvik.system.NativeStart.main(Native Method)

解决方案

The StreamingMediaPlayer class is using a double-buffering technique to get around limitations in pre-1.2 releases of Android. All production releases of Android OS have included a MediaPlayer that supports streaming media(1). I would recommend doing that rather than using this double-buffering technique to get around the problem.

Android OS 2.2 replaced the old media player code with the FrightCast player which probably is acting differently in this case.

The line numbers in your stack trace don't map to the file you link to, so I assume there's a different version that you're actually using. I'm going to guess that that NullPointerException is being reported by MediaPlayer but neither the FileInputStream nor the returned FileDescriptor can be null.

(1) Prior to version 2.2 the media player wouldn't recognize ShoutCast streams with an "ICY/1.1" version header in the response. By creating a proxy that replaces this with "HTTP/1.1" you can resolve that. See the StreamProxy class here for an example.

这篇关于Android MediaPlayer 在自定义音频流应用程序中工作正常,直到 Android 2.1 但在更高版本中不行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆