3

私は次の<audio>ようなコントロールを持つ要素を持っています:

<audio controls="controls" id="audio-sample" preload="auto">
    <source src="../../music-sample.php?type=ogg&amp;id=<?php echo $item->custom_5; ?>" type="audio/ogg" />
    <source src="../../music-sample.php?type=mp3&amp;id=<?php echo $item->custom_5; ?>" type="audio/mp3" />
</audio>

プレーヤーが表示され、サウンドは正常に再生されますが、トラックバーは経過時間を反映するように移動せず、ドラッグしてシークすることはできません。なぜだめですか?ある種の追加のヘッダーを送信する必要がありますか?これはすべて関連するPHPであり、特別なことは何もありません。

header('Content-Type: ' . $mimetype[$type]);

$file = fopen($filename, 'rb');
fpassthru($file);
fclose($file);
exit();

ここで問題をライブで見ることができます。

4

4 に答える 4

4

ヘッダーを設定してみてくださいContent-Length...

header("Content-Length: " . filesize($filename));

何らかの理由で前もってその情報がないと、トラックバーを配置するために必要な計算を行うことができません。

于 2012-11-01T04:46:31.007 に答える
2

FirefoxとSafariで機能させるための秘訣は、ここで説明するようContent-Rangeに、ヘッダーを送信することです。

$length = filesize($filename);

header('Content-Type: ' . $mimetype[$type]);
header('Content-Length: ' . $length);
header('Content-Range: bytes 0-' . ($length - 1) . '/' . $length);

readfile($filename);
于 2012-11-09T22:18:49.587 に答える
1

、、、の組み合わせContent-Type = audio/ogg、そして最も重要なのは、応答ヘッダーが私にとってうまくいったことだと思います。Content-LengthAccept-Ranges = bytesX-Content-Duration

X-Content-Durationヘッダーは、oggファイルの期間を秒単位でクライアントに通知します。https://developer.mozilla.org/en-US/docs/Configure_servers_for_Ogg_mediaについての詳細があります。

oggファイルの各フレームは可変ビット数でエンコードされる可能性があるため、ファイルサイズをバイト単位で知っているだけでは、ファイルの長さを秒単位で知ることはできません。ヘッダー付きのoggvorbisファイルについて、これをクライアントに明示的に伝えることができますX-Content-Duration

于 2012-11-09T22:30:42.663 に答える
1

私の経験

コードに問題はありません。私は一度この問題を抱えていました..そしてそれは単純なキャッシュの問題でFirefoxありContent-Length、あなたはそれを発見しました

c.php

<audio controls="controls" id="audio-sample" preload="auto">
    <source src="a.php?type=ogg&id=0" type="audio/ogg" />
    <source src="a.php?type=mp3&id=1" type="audio/mp3" />
</audio>

a.php

$id = intval($_GET['id']);
$files = array(0 => "audio.ogg",1 => "audio.mp3");
$filename = $files[$id];

header('Content-Type: ' . mime_content_type($filename));
header("Content-transfer-encoding: binary");
header("Content-Length: " . filesize($filename));

ob_clean();
flush();
readfile($filename);
exit();

これは100%Firefoxで機能しましたがreadfile($filename)

  readfile("SIMPLE ERROR ERROR");

Firefoxの敷居は、ファイルを支払わない代わりにオーディオを支払ってくれます。間違いを認識させる唯一の方法は、srcファイルにランダムな文字列を追加することでした。

<source src="a.php?type=ogg&id=0&<?php echo mt_rand(); ?>" type="audio/ogg" />
                                             ^---- rand string

このようにして、URLが要求され、Firefoxは音声を即座に再生しました。

問題

あなたが以前にコンテンツをストリーミングしようとしたので、Zero Content-Lengthそれはあなたのオーディオが支払っていない理由です.....Firefoxは最初の無効なコンテンツをキャッシュしました

解決

すべてのキャッシュをクリアします..上記のコードを使用すると、コードは正常に機能するか、テスト用にコードにrandパラメーターを追加するだけです。

ここに画像の説明を入力してください

無効な相対位置

永続的に使用すると、オーディオファイルをキャッシュmt_rand()することが困難になり、無効な相対ソリューションになります。Firefox

キャッシュのクリーニング後に削除するmt_randと、これは修正されます

于 2012-11-09T13:58:34.857 に答える