2012-04-08 4 views
42

ソケットを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変更要求が私が来る前にあったと思いますが、私は誰にも息を止めるよう勧めません。

+1

うわー!同じ問題! Nexus S. MediaPlayerでバッファが多すぎます – Alexis

+0

これはAndroidデベロッパーにバグとして記録する価値があります。 –

+3

この問題を解決するために提出したAndroidのバグには、どのような視認性を得るためにスターを付けてください - https://code.google.com/p/android/issues/detail?id=29870 – denizmveli

答えて

2

MediaPlayerをどこから開始するのが見えるでしょうか?

STREAM_MUSICオーディオストリームの種類を使用していますか?

player.setAudioStreamType(AudioManager.STREAM_MUSIC); 

また、player.prepareAsync(); player.prepare();?

ソリューションをした私が覚えている同様の問題は昨年、ありました:開始、一時停止してから起動するonPrepared():この場合は修正すること

player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
player.setDataSource(src); 
player.prepare(); 
player.start(); 
player.pause(); 
player.setOnPreparedListener(new OnPreparedListener() {  
@Override 
       public void onPrepared(MediaPlayer mp) { 
        player.start();     
       } 
      }); 

無理だろうが、あなた一方では、あなたの車輪を回転させると、これは一発の価値があるかもしれません。私にとってソリューションはAudioTrackでMediaCodecを使用していた

+0

ありがとうございます。残念ながら、私の問題は修正されませんでした。ちなみにこの実装が必要な問題は何でしたか? – denizmveli

+0

@ TheModernInk非常に高速なWIFI接続であっても、バッファリングに長いギャップがあります。 – ajacian81

関連する問題