3

シャウトキャスト/アイスキャスト オーディオ ストリームがあります。デフォルトのプレーヤーを使用して開く web サイトに、mobiledroid.php などのリンクを提供できるようにしたいと考えています。私はこれが別のサイトで行われているのを見たので、それが可能であることを知っています.

ストリームとしてphpファイルを介してphpヘッダーとストリームを使用していると思いますか?


Brad の指示を使用して、Android は実際にサウンド プレーヤーで開くオプションを提供します。良いですね。

また、PC を介して WMP でも再生されますが、上記のリンクがどのように再生されるかは Android ではありません

header("Content-type: audio/mpeg"); 
header("Transfer-Encoding: chunked"); 
header("Connection: close");

$sock = fsockopen($streamname,$port); //$streamname is the IP

fputs($sock, "GET $path HTTP/1.0\r\n"); //path in my case is /;stream.mp3
fputs($sock, "Host: $ip\r\n"); 
fputs($sock, "User-Agent: WinampMPEG/2.8\r\n"); 
fputs($sock, "Accept: */*\r\n"); 
fputs($sock, "Icy-MetaData:1\r\n"); 
fputs($sock, "Connection: close\r\n\r\n"); 


fpassthru($sock); 

fclose($sock);

Androidでは、「申し訳ありませんが、このプレーヤーはこのタイプのオーディオファイルをサポートしていません」と表示されます


更新 2:

削除"Transfer-Encoding"すると Android で再生されますが、ライブ ストリームには「Content-Length」がないため、通常どおり「準備中」ステータスでストリームを開始するのに長い時間がかかります。

header("Transfer-Encoding: none");上記のコードからも削除されました:

ブラッドの引用:

Android 2.3 以降では、Transfer-Encoding を「none」に設定すると問題が発生します。そのハードセット ヘッダーを削除すると、ストリームはチャンクされた Transfer-Encoding に戻ります。これは、Android 2.3 以降でうまく機能します。VLCはチャンクエンコーディングをサポートしていないため、もともとチャンクエンコーディングを無効にしていました。また、Android 2.2 以前はチャンク エンコーディングをサポートしていないようです。

Android でも動作しますが、ほとんどのライブ ストリームは開始までに非常に時間がかかることに注意してください。

4

1 に答える 1

5

問題

従来、ブラウザによって保存されるプレイリスト ファイルを提供し、そのようなプレイリストを開くように構成されたプレーヤー ソフトウェアで開きました。次に、プレーヤーはストリームの URL を読み取り、それに接続して、ストリーミングを開始します。

Android では、(なんらかの理由で) プレイリスト ファイルをサポートされているメディアとしてサポートしないことを選択しました。このため、従来の方法を使用してプレーヤーを直接起動する方法はありません。

解決

Android では、MP3 ファイル/ストリームに直接リンクすると、ファイルをダウンロードする代わりに、メディア プレーヤーを開いてストリーミングしようとするのがデフォルトのアクションのようです。これは、ストリームの URL に簡単に直接リンクできることを意味します (プレイリストのステップを完全にバイパスします)。

落とし穴があります... SHOUTcast で提供されるストリームは、厳密には HTTP に準拠していません。それらは近いですが、完全ではありません。ここでの本当のハングアップは、コンテンツの長さの 1 つと思われます。通常、HTTP サーバーはContent-Length応答ヘッダーを送信します。ストリーミング メディアでは、長さは不明です。この問題を回避するには、次の 2 つの方法があります。

  1. チャンク転送エンコーディングを使用します。これを行うには、次のヘッダーを設定します。
    Transfer-Encoding: chunked
    次に、ストリームにチャンク エンコーディングを使用すると、準備完了です。
  2. 転送エンコーディングを使用せず、次のヘッダーを使用して、リソースの転送が終了したときに接続が閉じられるように指定します。
    Transfer-Encoding: none
    Connection: close

リンクの例では、方法 1 を使用しています。私も方法2をうまく使っています。

サーバーが有効な HTTP と通信すると、Android での再生は簡単にできます。

実装

この修正を実装するにはいくつかの方法があります。PHPソリューションについて言及しました。cURL が機能しない場合は、いつでもfsockopen()またはstream_socket_client()直接 TCP 接続を確立して、着信ストリーム データを自分で処理できます。そこから、正しい応答ヘッダーを送信し、受信したデータを中継するだけです。接続されたクライアントごとに PHP インスタンスが実行され、各インスタンスがサーバーにも接続することに注意してください。これは理想的ではありませんが、利用可能なものによっては、これが唯一の方法である可能性があります。

于 2012-07-15T16:08:22.557 に答える