MediaPlayer在模拟器上工作,但不在设备上工作

时间:2011-09-17 19:33:11

标签: android streaming android-mediaplayer emulation

我正在开发Android的广播应用,我发现了一个奇怪的问题。这是代码的一部分:

mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setVolume(1, 1);
try {
    mediaPlayer.setDataSource(url);
    mediaPlayer.setOnPreparedListener(
    mediaPlayer.prepareAsync(); // prepare async to not block main thread

该程序在模拟器(2.2,2.3)上运行良好,但是当我尝试使用我的两个设备(均为Android 2.2)时,没有音频。我已经尝试了很多变通方法,但是看起来很奇怪Audio在模拟器上工作,但在设备上却没有。

PS:我已设置了互联网权限

所有列表器都已启动(OnBufferingUpdateListener,OnCompletionListener,OnErrorListener,OnInfoListener,OnPreparedListener)在模拟器上我听音乐,但它在logcat中出错:emulator log

这是logcat(在设备上)中显示的错误:

E/OMXPlayer(  953): Creating new NVOMXPlayer: 0x9c1a8
E/OMXPlayer(  953): onFirstRef ++
E/OMXPlayer(  953): onFirstRef --
E/OMXPlayer(  953): setdatasource ++
E/OMXPlayer(  953): 0x9c1a8 setDataSource url=http://XXXXXX:8000
E/OMXPlayer(  953): render thread(10972) started: 0x9c1a8
E/OMXPlayer(  953): STATE_PREPARING - signal wait 0x9c1a8
E/OMXPlayer(  953): prepareAsync: 0x9c1a8
E/OMXPlayer(  953): STATE_PREPARING - signal rx'd 0x9c1a8
E/OMXPlayer(  953): prepare 0x9c1a8
E/OMXPlayer(  953): 0x9c1a8 Creating player for: http://XXXXX:8000
D/        (  961): NVRM_DAEMON(803): rt_exist=2, add client ref
D/        (  953): NvMMSetUserAgentString:: Len: 49: String: User-Agent: (NvMM Client v0.1; Linux;Android 2.2)
D/        (  953): connect cancelled
D/        (  953): connect cancelled
D/        (  953): connect cancelled
D/        (  953): connect cancelled
D/        (  953): connect cancelled
D/        (  953): connect cancelled
D/        (  953): connect cancelled
D/        (  953): Event_BlockError from 13SuperParser : Error code - 4
D/        (  953): Graph_EventHandler: ERROR for READER [0x80001005]
D/        (  953): Graph_EventHandler: ERROR for READER [0x80001005]
E/MediaPlayer(10958): error (1, 0)
E/        (10958): Prepare failed.: status=0x1
E/        (10958): java.io.IOException: Prepare failed.: status=0x1
E/        (10958):      at android.media.MediaPlayer.prepare(Native Method)
E/        (10958):      at app.relax.com.StreamingMediaPlayer.listen(StreamingMediaPlayer.java:64)
E/        (10958):      at app.relax.com.StreamingMediaPlayer.startListening(StreamingMediaPlayer.java:74)
E/        (10958):      at app.relax.com.StreamingMediaPlayer.access$0(StreamingMediaPlayer.java:70)
E/        (10958):      at app.relax.com.StreamingMediaPlayer$1.run(StreamingMediaPlayer.java:51)
E/        (10958):      at java.lang.Thread.run(Thread.java:1096)
E/OMXPlayer(  953): prepare 0x9c1a8 exit with error
E/OMXPlayer(  953): Error in prepare
E/OMXPlayer(  953): Worker Thread Exit -

1 个答案:

答案 0 :(得分:0)

流的媒体类型是什么?也许您在生产设备上缺少该格式的CODEC。

老实说,生产设备往往比仿真器具有更好的CODEC,因为2.x设备通常具有WMA以及MP3和MP4。但也许这会打破一些东西。

如果是播放列表格式(例如m3u),或复合格式(atom?rss?,或其他格式在信封中有多种格式的多个流URL),生产设备可能会选择不流式传输的格式好吧例如他们选择一个WMA流,但发现它只有在开始解码时才有DRM。

互联网广播经常使用某种复合格式。他们经常将DRM放在他们的WMA流上。实际上,这将是一个很好的候选人。

对于它的价值,2.x流媒体支持非常弱。如果您可以破解信封并选择MP3或MP4而不是WMA,那么您可以做得更好。

但第一个问题是:流的格式是什么。

我认为也很模糊:如果您的生产设备已植根,则会禁用对受DRM保护的文件的解码。尝试使用无根设备吗?

最后的可能性:2.x设备使用各种音频堆栈。 NVOMXPlayer看起来并不熟悉。它们是Atrix设备吗?