【问题标题】:MediaPlayer working on emulator, but not on deviceMediaPlayer 在模拟器上工作,但不在设备上
【发布时间】:2011-09-17 19:33:10
【问题描述】:

我正在开发一款适用于 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 中出现错误: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 -

【问题讨论】:

  • 什么返回“isPlaying()”?你的流在播放吗?确保设置音量。您还可以注册一个监听器来检查是否有警告或错误“setOnInfoListener()”。
  • 在设备上它给我一个解码器错误,在模拟器中工作。我真的不明白发生了什么:|
  • @Copa 你有解决办法吗?我真的不知道该怎么办。
  • 没有人吗? :(我做了很多测试,但只适用于模拟器
  • 我也有同样的问题。你找到解决方案了吗@Stefano?

标签: android streaming android-mediaplayer emulation


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2023-03-23
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多