flvファイルまたはmp4ファイルをダウンロードするときにphpが再生できません
flv再生アドレスまたはmp4再生アドレスをPOST経由で転送して直接ダウンロードしたいのですが、ダウンロードは簡単で、POSTデータを直接受信する形式です。 POST からのデータは似ています: http://a .com/1.flv で、PHP 経由でダウンロードします。
<?php $url = implode($_POST); $file = file_get_contents($yes); header("Content-Disposition:attachment;filename=1.flv"); echo $file; ?>
または
<?php $url = implode($_POST); header("Content-type:video/mpeg4"); header("Content-Disposition:attachment;filename=1.flv"); readfile($url); exit; ?>
の 2 つの方法がテストされました (ダウンロード用の簡略化されたコードのみが掲載されています)。その後、1.flv ファイルは正常にダウンロードされましたが、ダウンロード後に動作しませんでした。Linux を使用して、wget http://a.com/1.flv から直接ダウンロードすると、再生できます。 PHP 経由で直接ダウンロードを開くとエラーが発生します:
ファイル サイズを比較すると、再生できないバイトがさらに 3 バイトあることがわかります:
その後、vim エディターは実際にさらに 3 バイトがあることを発見しました。ファイルの先頭にバイトがありますが、何バイトあるかはわかりませんが、次の 3 バイトを削除すると再生できます:
オンラインで検索しても答えが見つからず、見つかりませんでしたこれについては何でも。 。何が問題なのか本当に分かりません。神様が答えられるよう助けてくれませんか = =
解決策:
これらの 3 文字は伝説の BOM です
ダウンロードに使用している php ファイルが次の場所にあることを示してください。 UTF- フォーマット 8 (BOM 付き)、Notepad++ を使用して確認してください
それともすべての PHP ファイルを読み取って削除しますか?
/** * 移除字符串的BOM * * @param string $str 输入字符串 * @return string 输出字符串 */ function removeBOM($str) { $str_2 = substr($str, 0, 2); $str_3 = substr($str, 0, 3);//$str_2.$str{2}; $str_4 = substr($str, 0, 4);//$str_3.$str{3}; if ($str_3 == pack('CCC',0xef,0xbb,0xbf)) //utf-8 return substr($str, 3); elseif ($str_2 == pack('CC',0xfe,0xff) || $str_2 == pack('CC',0xff,0xfe)) //unicode return substr($str, 2); elseif ($str_4 == pack('CCCC',0x00,0x00,0xfe,0xff) || $str_4 == pack('CCCC',0xff,0xfe,0x00,0x00)) //utf-32 return substr($str, 4); return $str; }
関連記事:
PHPでビデオをMP4に変換し、ビデオプレビューを取得する方法