3

外部サーバーからライブ オーディオをストリーミングするアプリを構築しています。しばらくの間 (通常は 5 ~ 20 分) ストリーミングした後、オーディオの再生が停止します。最初に 703-MEDIA_INFO_NETWORK_BANDWIDTH を取得し (通常は extra = 0 と一緒に)、次に 701-MEDIA_INFO_BUFFERING_START を取得します

しかし、私は決して 702-MEDIA_INFO_BUFFERING_END を取得しません。onCompletion または onError へのコールバックがありません。

A small stack:

08-28 09:18:17.969: WARN/MediaPlayer(7100): info/warning (703, 0)

08-28 09:18:17.969: WARN/MediaPlayer(7100): info/warning (701, 0)

08-28 09:18:17.969: INFO/MediaPlayer(7100): Info (703,0)

08-28 09:18:17.979: INFO/MediaPlayer(7100): Info (701,0)

08-28 09:18:18.029: DEBUG/dalvikvm(7100): GC_CONCURRENT freed 1307K, 15% free 13198K/15376K, paused 5ms+3ms, total 28ms

08-28 09:18:19.411: DEBUG/dalvikvm(16310): GC_CONCURRENT freed 315K, 4% free 9909K/10264K, paused 7ms+6ms, total 69ms

08-28 09:18:20.992: DEBUG/audio_hw_primary(176): out_standby: enter: usecase(1: low-latency-playback)

08-28 09:18:21.082: DEBUG/audio_hw_primary(176): stop_output_stream: enter: usecase(1: low-latency-playback)

08-28 09:18:21.082: DEBUG/audio_hw_primary(176): disable_audio_route: reset mixer path: low-latency-playback

08-28 09:18:21.082: DEBUG/audio_hw_primary(176): disable_snd_device: snd_device(4: headphones)

08-28 09:18:21.102: DEBUG/audio_hw_primary(176): stop_output_stream: exit: status(0)

08-28 09:18:21.102: DEBUG/audio_hw_primary(176): out_standby: exit 

おわかりのように、audio_hw_primary で怪しいものが発生しています。それが何であるかを検索しましたが、良い答えが見つかりませんでした。

私の MediaPlayer は、フォアグラウンドとして開始されるサービスで実行され、実装が Google のすべてのガイドラインに従っていると確信しています: http://developer.android.com/guide/topics/media/mediaplayer.html

Android 4.1-4.3 を搭載した Nexus 4 でアプリをテストしました。

4

1 に答える 1

0

http://developer.android.com/guide/topics/media/mediaplayer.html 「ウェイクロックの使用」を読む必要があります。

MediaPlayer の再生中に CPU が動作し続けるようにするには、MediaPlayer の初期化時に setWakeMode() メソッドを呼び出します。これを行うと、MediaPlayer は再生中に指定されたロックを保持し、一時停止または停止時にロックを解放します。

mMediaPlayer = new MediaPlayer();
// ... other initialization here ...
mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);

ただし、この例で取得した wake lock は、CPU が起動していることのみを保証します。ネットワーク経由でメディアをストリーミングしていて、Wi-Fi を使用している場合は、おそらく WifiLock も保持する必要がありますが、これは手動で取得して解放する必要があります。そのため、リモート URL で MediaPlayer の準備を開始するときに、Wi-Fi ロックを作成して取得する必要があります。例えば:

WifiLock wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE))
    .createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");

wifiLock.acquire();
于 2013-08-28T07:46:06.087 に答える