2011-09-17 105 views
2

我正在为android安装一个电台应用程序,并且发现了一个奇怪的问题。这是代码的一部分:Android:在模拟器上工作的MediaPlayer,但不在设备上

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的),没有音频。我已经尝试了很多解决方法,但它似乎很奇怪,音频在模拟器上工作,但不在设备上。

PS:我已经设置网络权限

编辑:所有listiners均达到(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 - 
+0

什么返回“isPlaying()”?你的流是否播放?确保你设置了音量。您还可以注册一个侦听器来检查是否存在警告或错误“setOnInfoListener()”。 –

+0

在设备上它给了我一个解码器错误,在模拟器工作。我真的不明白发生了什么:| – Stefano

+0

哪个解码错误? –

回答

0

什么是流媒体类型?也许你错过了生产设备上那种格式的编解码器。

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

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

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

对于什么是值得的,2.x流支持是相当薄弱的。如果你能破解信封并选择MP3或MP4而不是WMA,你可能会做得更好。

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

我猜想还有一点可能:如果你的制作设备是固定的,那就禁用DRM保护文件的解码。尝试使用无根设备吗?

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

相关问题