2

我正在开发适用于 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)上尝试时,没有音频。我尝试了很多解决方法,但音频在模拟器上工作,但在设备上却不行,这似乎很奇怪。

PS:我已经设置了上网权限

所有的侦听器都已启动(OnBufferingUpdateListener、OnCompletionListener、OnErrorListener、OnInfoListener、OnPreparedListener)在模拟器上我听音乐,但它在 logcat 中给出错误:模拟器日志

这是 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 -
4

1 回答 1

0

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

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

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

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

就其价值而言,2.x 流媒体支持非常薄弱。如果您能破解信封并选择 MP3 或 MP4 而不是 WMA,您可能会做得更好。

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

我想也有可能:如果您的生产设备已植根,则会禁用受 DRM 保护的文件的解码。用无根设备试试?

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

于 2012-12-09T13:15:13.173 回答