让mp3看起来像PHP
我编写了这个PHP脚本 $file_name = 'sample.mp3'; header('Content-Type: audio/mpeg'); $opts = array('http' => array( 'method' => 'GET', 'protocol_version' => 1.1, ) ); $context = stream_context_create($opts); $stream = fopen($file_name, 'rb', FALSE, $context); $metadata = stream_get_meta_data($stream); $data = stream_get_contents($stream); print($data); fclose($stream); $file_name='sample.mp3'; 标题(“内容类型:音频/mpeg”); $opts=array('http'=> 排列( '方法'=>'获取', “协议_版本”=>1.1, ) ); $context=stream\u context\u create($opts); $stream=fopen($file_name,'rb',FALSE,$context); $metadata=流\获取\元数据($stream); $data=stream\u get\u contents($stream); 打印(数据); fclose($流);让mp3看起来像PHP,php,html,Php,Html,我编写了这个PHP脚本 $file_name = 'sample.mp3'; header('Content-Type: audio/mpeg'); $opts = array('http' => array( 'method' => 'GET', 'protocol_version' => 1.1,
它可以成功地流式播放mp3媒体,但我无法找到同样在html5
视频中播放的mp3文件。标签无法从中提取元数据,请告诉我哪里出了问题,以及如何使此过程正常工作,谢谢这应该能够解决您的问题,请遵循此方法
您需要做的是使用readfile()
并设置file\u exists()
,这样您就可以知道您正在打开正确的文件
$extension = "mp3";
$mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3";
if(file_exists($file_name)){
header('Content-type: ' . $mime_type);
header('Content-length: ' . filesize($file_name));
header('Content-Disposition: filename="' . $file_name);
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
readfile($file_name);
}
在这里尝试一下,支持部分下载和搜索任何文件大小,现在也可以在chrome中正常工作:
<?php
$file_name = './sample.mp3';
stream($file_name, 'audio/mpeg');
/**
* Stream-able file handler
*
* @param String $file_location
* @param Header|String $content_type
* @return content
*/
function stream($file, $content_type = 'application/octet-stream') {
@error_reporting(0);
// Make sure the files exists, otherwise we are wasting our time
if (!file_exists($file)) {
header("HTTP/1.1 404 Not Found");
exit;
}
// Get file size
$filesize = sprintf("%u", filesize($file));
// Handle 'Range' header
if(isset($_SERVER['HTTP_RANGE'])){
$range = $_SERVER['HTTP_RANGE'];
}elseif($apache = apache_request_headers()){
$headers = array();
foreach ($apache as $header => $val){
$headers[strtolower($header)] = $val;
}
if(isset($headers['range'])){
$range = $headers['range'];
}
else $range = FALSE;
} else $range = FALSE;
//Is range
if($range){
$partial = true;
list($param, $range) = explode('=',$range);
// Bad request - range unit is not 'bytes'
if(strtolower(trim($param)) != 'bytes'){
header("HTTP/1.1 400 Invalid Request");
exit;
}
// Get range values
$range = explode(',',$range);
$range = explode('-',$range[0]);
// Deal with range values
if ($range[0] === ''){
$end = $filesize - 1;
$start = $end - intval($range[0]);
} else if ($range[1] === '') {
$start = intval($range[0]);
$end = $filesize - 1;
}else{
// Both numbers present, return specific range
$start = intval($range[0]);
$end = intval($range[1]);
if ($end >= $filesize || (!$start && (!$end || $end == ($filesize - 1)))) $partial = false; // Invalid range/whole file specified, return whole file
}
$length = $end - $start + 1;
}
// No range requested
else $partial = false;
// Send standard headers
header("Content-Type: $content_type");
header("Content-Length: " . ($partial ? $length : $filesize));
header('Accept-Ranges: bytes');
// send extra headers for range handling...
if ($partial) {
header('HTTP/1.1 206 Partial Content');
header("Content-Range: bytes $start-$end/$filesize");
if (!$fp = fopen($file, 'rb')) {
header("HTTP/1.1 500 Internal Server Error");
exit;
}
if ($start) fseek($fp,$start);
while($length){
set_time_limit(0);
$read = ($length > 8192) ? 8192 : $length;
$length -= $read;
print(fread($fp,$read));
}
fclose($fp);
}
//just send the whole file
else readfile($file);
exit;
}
?>
我想要缓冲,我怎么能?如上所述,它没有内容范围
;在Chrome中,如果没有.header('Content-typ…缺少双引号,解决方案不可用),则当前无法(5年后)设置currentTimework@joshkrz-您应该确保不发送任何输出(空白、html)在设置标题之前,获取的错误将告诉您输出的位置。@joshkrz异常行将在页面上回响,我不确定您如何调用它,但您应该将其包装在try{}catch(){}
捕捉异常。@joshkrz函数现在已经为chrome修复,希望如此helps@LozCherone Content Length应该是您发送的长度。这并不总是文件大小($file)。实际上(进行了建议的编辑,但现在无法撤消),我认为内容长度应该更像:标题(“内容长度:”($range?($end-$start+1):$filesize));
。