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) でうまく動作しますが、2 つのデバイス (両方とも 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

ストリームのメディア タイプは何ですか? おそらく、製品デバイスでその形式のコーデックが欠落している可能性があります。

正直なところ、2.x デバイスには MP3 や MP4 だけでなく WMA も搭載されていることが多いため、製品デバイスはエミュレーターよりも優れた CODEC を搭載している傾向があります。しかし、それは何かを壊すかもしれません。

プレイリスト形式 (例: m3u)、または複合形式 (atom? rss?、またはエンベロープ内の複数の形式の複数のストリーム URL を含むその他の形式) である場合、制作デバイスはあまりうまくストリーミングできない形式を選択する可能性があります。たとえば、彼らは WMA ストリームを選択しますが、デコードを開始して初めて DRM があることがわかります。

インターネット ラジオでは、ある種の複合形式を使用することがよくあります。また、WMA ストリームに DRM を適用することもよくあります。実際、それは良い候補になるでしょう。

価値があるのは、2.x ストリーミングのサポートがかなり弱いことです。封筒をクラックして、WMA の代わりに MP3 または MP4 を選択できる場合は、はるかにうまくいく可能性があります。

しかし、最初の質問は、ストリームの形式は何かということです。

また漠然と可能性があると思います: プロダクション デバイスがルート化されている場合、DRM で保護されたファイルのデコードが無効になります。ルート化されていないデバイスで試してみますか?

最後の可能性: 2.x デバイスは、さまざまなオーディオ スタックを使用します。NVOMXPlayer はなじみがありません。それらは Atrix デバイスですか?

于 2012-12-09T13:15:13.173 に答える