用PHP实现MP4s流媒体

用PHP实现MP4s流媒体,php,ftp,streaming,mp4,Php,Ftp,Streaming,Mp4,我正在尝试通过FTP和PHP传输mp4文件,但只有MP3会流,mp4会下载但不会流有一个特殊的格式,mp4必须在流 这是我正在尝试的代码: $response = ftp_raw($ftp, 'SIZE '.$_GET['path']); $size = floatval(str_replace('213 ', '', $response[0])); if(substr($_GET['path'], -4) == '.mp3') { header('Content-Type: audio

我正在尝试通过FTP和PHP传输mp4文件,但只有MP3会流,mp4会下载但不会流有一个特殊的格式,mp4必须在流

这是我正在尝试的代码:

$response =  ftp_raw($ftp, 'SIZE '.$_GET['path']); 
$size = floatval(str_replace('213 ', '', $response[0]));
if(substr($_GET['path'], -4) == '.mp3') {
  header('Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3');
}
if(substr($_GET['path'], -4) == ".mp4") {
  header('Content-Type: video/mpeg');
}
header('Content-Encoding: chunked');
header('Connection: keep-alive');
header('Content-Disposition: inline; filename="'. basename($_GET["path"]). '"');
header('Content-Description: File Transfer'); 
header("Content-Length: $size");
header('Content-Transfer-Encoding: binary'); 
header('X-Pad: avoid browser bug');
header('Pragma: public');
header('Expires: -1');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Content-Range: bytes 0-'.$size); 
header('Accept-Ranges: bytes');
$out = fopen('php://output', 'w');
if (!ftp_fget($ftp, $out, $_GET['path'], FTP_BINARY)) die('Unable to get file: ' . $remote_file);
fclose($out);

您需要某种流服务器。如果你真的想用PHP来实现这一点,我强烈反对,那么你需要打开一个套接字连接,并写入你将从文件中顺序读取的数据块。。。在循环中,直到遍历整个文件

考虑到您还应该考虑并发性和适当的内存管理,考虑到php的性能(开销,不是线程友好的…或者我被告知的那样…),不要对php这样做

有很多开源流媒体解决方案,它们将满足您的需要

是的,PHP并不是专门为这个设计的。。。虽然这在理论上是可能的


如果我错了,请大家纠正我。

我也尝试过内容类型:video/mp4。我猜这与
内容范围
标题有关。客户端可能会请求文件的某个部分,但您正在发送整个文件。另外,我不知道这里是否需要
内容编码:chunked
。您的MP4文件是否经过编码以允许流式传输?@RocketHazmat Yes。它与一种叫做Moov原子的东西有关。如果这是在文件的结尾,它将不会蒸汽。某些编码器会将其放在文件的末尾。有一些工具可以将Moov原子切换到文件的开头。我一点也不知道,但你应该可以在谷歌上找到适合你的环境的东西。最好在ftp服务器上存储的原始文件上执行此操作。