1

PHP を使用してファイルから読み取り、ストリーム出力したいと考えています。

私のコードは次のようになります。

teststream.php

$bufsize=4096; // amount of buffer to read at a time.

$h = fopen("test.wav", "rb");
$stdout = fopen("php://stdout", "wb");

while ( !feof($h) ) {
    $buf = fread($h, $bufsize);
    fwrite($stdout, $buf);
}

pclose( $h );

そして、それを次のようにメディアプレーヤー(VLCなど)に入れたいと思います:

http://www.test.com/teststream.php

このアプローチは機能していません。その理由はわかりません。

---- 更新されたコードは次のようになります。

<?php

$bufsize=4096; // amount of buffer to read at a time.

$h = fopen(dirname(__FILE__)."/test.wav", "rb");
header("Content-Type: audio/x-wav", true);
$stdout = fopen("php://stdout", "wb");

$total=0;
while ( !feof($h) ) {
    $buf = fread($h, $bufsize);

    $total=$total+strlen($buf);
    error_log("buf read: ".strlen($buf).", total: ".$total);

    fwrite($stdout, $buf);
}

fclose( $h );

Apache の error_log は次のようになります。

[Wed Oct 30 00:29:12 2013] [error] [client 50.201.227.222] buf read: 4096, total: 4096
[Wed Oct 30 00:29:12 2013] [error] [client 50.201.227.222] buf read: 4096, total: 8192
[Wed Oct 30 00:29:12 2013] [error] [client 50.201.227.222] buf read: 4096, total: 12288
...
...

したがって、データを送信しているように見えますが、VLC 側でオーディオを再生することはありません。VLC をhttp://www.test.com/test.wavにポイントすると、正常に再生されます... ??

4

2 に答える 2

0

PHP はエラーを報告していますか? test.wav が見つからない可能性があります。このファイルが PHP スクリプトと同じフォルダーにある場合は、コードを次のように変更します。

$bufsize=4096; // amount of buffer to read at a time.

$h = fopen(dirname(__FILE__) . "/test.wav", "rb");
$stdout = fopen("php://stdout", "wb");

while ( !feof($h) ) {
    $buf = fread($h, $bufsize);
    fwrite($stdout, $buf);
}

pclose( $h );

ああ、はい、次のように出力にヘッダーを追加します。

header("Content-Type: audio/x-wav", true);
于 2013-10-30T00:12:24.103 に答える
0

私は自分のプロジェクトでこれを行いましたが、それは魅力のように機能します:

//send file contents
$fp=fopen(dirname(__FILE__) . "/test.wav", "rb");
header("Content-type: application/octet-stream");
header('Content-disposition: attachment; filename="test.wav"');
header("Content-transfer-encoding: binary");
header("Content-length: ".filesize(dirname(__FILE__) . "/test.wav")."    ");
fpassthru($fp);
fclose($fp);
于 2013-10-30T00:40:13.227 に答える