8

最近、Samsung Galaxy S4 の Android アプリでオーディオが再生されないという報告を受けています。アプリは他のデバイスでは問題ありません。

オーディオは MediaPlayer を使用してストリーミングされます。Android Socket メソッドを使用してローカルに保存されます。

Logcat の警告は、次の原因で発生します。

try {
    byte[] buffer = httpString.toString().getBytes();
    int readBytes = -1;
    Log.d(LOG_TAG, "writing to client");
    client.getOutputStream().write(buffer, 0, buffer.length);

    // Start streaming content.
    byte[] buff = new byte[1024 * 64];
    while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) {
        client.getOutputStream().write(buff, 0, readBytes);
    }
}

スタック トレースは次のとおりです。

D/StreamProxy(3913): downloaded
D/StreamProxy(3913): downloading...
D/StreamProxy(3913): reading headers
D/StreamProxy(3913): headers done HTTP/1.0 200 OK
D/StreamProxy(3913): Content-Type: audio/mpeg
D/StreamProxy(3913): 
D/StreamProxy(3913): writing to client
W/StreamProxy(3913): Broken pipe.
W/StreamProxy(3913): java.net.SocketException: sendto failed: EPIPE (Broken pipe)
W/StreamProxy(3913):    at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506)
W/StreamProxy(3913):    at libcore.io.IoBridge.sendto(IoBridge.java:475)
W/StreamProxy(3913):    at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507)
W/StreamProxy(3913):    at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
W/StreamProxy(3913):    at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269)
W/StreamProxy(3913):    at com.gm.mobile.util.StreamProxy.processRequest(StreamProxy.java:234)
W/StreamProxy(3913):    at com.gm.mobile.util.StreamProxy.run(StreamProxy.java:123)
W/StreamProxy(3913):    at java.lang.Thread.run(Thread.java:856)
W/StreamProxy(3913): Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe)
W/StreamProxy(3913):    at libcore.io.Posix.sendtoBytes(Native Method)
W/StreamProxy(3913):    at libcore.io.Posix.sendto(Posix.java:151)
W/StreamProxy(3913):    at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
W/StreamProxy(3913):    at libcore.io.IoBridge.sendto(IoBridge.java:473)
W/StreamProxy(3913):    ... 6 more
E/(3913): client closing
D/StreamProxy(3913): Proxy interrupted. Shutting down.

プロキシ コードをコメント アウトするとストリームが再生されますが、再生が 1 秒間開始され、その後 2 ~ 3 秒間バッファリングが開始されてから再開されます。

どんな解決策も大いに受け入れられます。

同様の問題が見つかりましたが、解決されていません。

4

2 に答える 2

4

私はついにこれを引き起こした問題を理解しました。予想どおり、メディア プレーヤーは id3 情報を見つけようとして範囲要求を行っていました。他の電話機では、ヘッダー ステータス行を に設定するだけでHTTP/1.0 206 OK、メディア プレーヤーがそのような範囲リクエストを実行できなくなります。ただし、奇妙な理由により、これは S4 には当てはまりません (Samsung に感謝します!)。

したがって、これを修正するには、これらの範囲リクエストを処理するだけで済みます。私の場合、私はsocket.accept()一度だけ電話をかけました。これをループで実行するように変更しましたがisRunning、関数では true ですrun()。このようにして、新しいリクエストが行われると、適切に処理されます。私のコードの切り詰められたバージョンは次のようになります...

public void run() {

    while (isRunning) {

        client = socket.accept();

        HttpResponse cloudResponse = startCloudRequest();
        sendDataToMediaPlayer(cloudResponse);

    }
}

お役に立てれば。

于 2013-06-05T01:26:18.543 に答える
0

壊れたパイプは通常、反対側が接続を閉じたときに発生します。ヘッダーを正しくプロキシしていることを確認してから、本文にスローする前に 2 つの改行を挿入してください。相手側に供給しているものは、ソケットのクローズを促している可能性があります....これはS4でのみ発生しますか? コンテンツの長さを送信していますか?

于 2013-05-22T22:21:40.833 に答える