ソケットをMediaPlayerのプロキシとして使用しているため、ソケットに書き込む前にmp3オーディオをダウンロードして解読できます。これはNPRニュースアプリに表示されている例に似ていますが、私はこれをAndroidバージョン2.1 - 4 atmすべてに使用しています。Android-MediaPlayer ICS 4.0のバッファサイズ
NPR StreamProxyコードは - 2.3、しかし、アンドロイド4.0 ICS MediaPlayerのバッファが多すぎるデータでonPreparedリスナーを発射する前に - http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java
私の問題は、再生が2.1の高速であるということです。
onPrepared(前ソケットOutputStreamに書き込まれたデータの一例量):2.3.4とSGS2で
- onPrepared()〜133920バイト
4.0.4とネクサスSで後 - onPrepared ()〜961930バイト後
これはGalaxy Nexusでも発生します。
奇妙なことに、4.0エミュレータは4.0デバイスほどのデータをバッファしません。誰でもICSのMediaPlayerで同様の問題が発生しますか?ここで
EDIT
は、プロキシがソケットに書き込んでみましょう。この例では、ファイルからロードされたCipherInputStreamからのものですが、HttpResponseからロードされたときにも同じことが起こります。
final Socket client = (setup above)
// encrypted file input stream
final CipherInputStream inputStream = getInputStream(file);
// setup the socket output stream
final OutputStream output = client.getOutputStream();
// Writing the header
final String httpHeader = buildHttpHeader(file.length());
final byte[] buffer = httpHeader.getBytes("UTF-8");
output.write(buffer, 0, buffer.length);
int writtenBytes = 0;
int readBytes;
final byte[] buff = new byte[1024 * 12]; // 12 KB
while (mIsRunning && (readBytes = inputStream.read(buff)) != -1) {
output.write(buff, 0, readBytes);
writtenBytes += readBytes;
}
output.flush();
output.close();
オーディオ前のMediaPlayerに書き込まれたHTTPヘッダ..
private String buildHttpHeader(final int contentLength) {
final StringBuilder sb = new StringBuilder();
sb.append("HTTP/1.1 200 OK\r\n");
sb.append("Content-Length: ").append(contentLength).append("\r\n");
sb.append("Accept-Ranges: bytes\r\n");
sb.append("Content-Type: audio/mpeg\r\n");
sb.append("Connection: close\r\n");
sb.append("\r\n");
return sb.toString();
}
私は別の実装のために周りを見回してきましたが、私はオーディオ暗号化されているとのMediaPlayerのように、入力ストリームをサポートしていないとして、データソース私の唯一のオプション(私は思う..)は、このようなプロキシを使用することです。
これはAndroid 2.1 - 2.3でもうまくいきますが、ICSではMediaPlayerが再生前に膨大な量のこのデータをバッファしています。
EDIT 2:
さらなる試験が、これはまた、かつてのAndroid 4.0.3にアップグレードSGS2上の問題であることを示しています。 MediaPlayerのバッファリング実装が4.0で大幅に変更されたようです。これは、APIが動作を変更する方法を提供しないため、イライラしています。
編集3:
Androidバグが作成されました。コメントを追加し、同様に http://code.google.com/p/android/issues/detail?id=29870
EDIT 4が主演してください:
私の再生コードが..私は私のonPrepared()メソッドではMediaPlayerの上の開始()の呼び出しを持ってかなり標準的です。
mCurrentPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mCurrentPlayer.setDataSource(url);
mCurrentPlayer.prepareAsync();
持っているだけで(準備使用して、それを試してみました)ともajacian81さんは道をお勧めしますが、無駄に。
私は最近、Googleの従業員が私の質問について私に連絡を取り、バッファサイズがICS(HDコンテンツ用)で意図的に増加したことを確認する必要があります。 API開発者は、MediaPlayerにバッファサイズを設定する機能を追加することが求められています。
私はこのAPI変更要求が私が来る前にあったと思いますが、私は誰にも息を止めるよう勧めません。
うわー!同じ問題! Nexus S. MediaPlayerでバッファが多すぎます – Alexis
これはAndroidデベロッパーにバグとして記録する価値があります。 –
この問題を解決するために提出したAndroidのバグには、どのような視認性を得るためにスターを付けてください - https://code.google.com/p/android/issues/detail?id=29870 – denizmveli