Показывать видео на iPhone/iPad через PHP
Я хотел бы показать mp4 через тег видео, а исходный URL видео - это URL-адрес приложения YII. Раньше я использовал Yii:app->request->sendFile, но видео не работало на iPad/iPhone, поэтому сейчас я пытаюсь отправить заголовки самостоятельно, используя приведенный ниже код, но все еще не работает.
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$file_path = "video.mp4";
$file_mime_type = finfo_file($finfo, $file_path);
$file_size = filesize($file_path);
header("HTTP/1.1 206 Partial Content");
header("Accept-Ranges: bytes");
header("Content-Type: $file_mime_type");
header("Content-Length: $file_size");
header("Content-Range: bytes 0-".($file_size-1)."/$file_size");
readfile($file_path);
exit;
Я даже пытался реализовать функцию rangeDownload с http://mobiforge.com/developing/story/content-delivery-mobile-devices но проблема в том, что $_SERVER['HTTP_RANGE'] всегда null
даже когда запрос приходит с iPhone/iPad.
Я также попробовал это решение здесь mp4 файл через php не воспроизводится как видео html5, но безрезультатно снова..
Приведенный выше код отлично работает для веб-браузера. Кроме того, если я получаю доступ к.mp4 напрямую с iPhone / iPad, он тоже работает нормально, так что это не проблема с самим видео
Любая помощь, пожалуйста?
1 ответ
Ваша проблема может быть по нескольким причинам.
1) Вы не можете создать правильное видео. Попробуйте использовать такую строку:
c:\utils\ffmpeg\bin\ffmpeg -i MVI_7386.MOV -acodec aac -ac 2 -strict experimental -b:a 160k -s 640x480 -vcodec libx264 -preset slow -profile:v baseline -level 30 -maxrate 10000000 -bufsize 10000000 -b:v 1200k -pix_fmt yuv420p -f mp4 -threads 2 -async 1 -vsync 1 -y video.ipad.mp4
2) Я использовал этот ответ с небольшими изменениями для отправки видео через php. Вот мой файл video.php:
<?php
$path = './video.ipad.mp4';
if (file_exists($path)) {
$size=filesize($path);
$fm=@fopen($path,'rb');
if(!$fm) {
// You can also redirect here
header ("HTTP/1.1 404 Not Found");
die();
}
$begin=0;
$end=$size;
if(isset($_SERVER['HTTP_RANGE'])) {
if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i',
$_SERVER['HTTP_RANGE'],$matches)){
$begin=intval($matches[1]);
if(!empty($matches[2])) {
$end=intval($matches[2]);
}
}
}
if($begin>0||$end<$size) header('HTTP/1.1 206 Partial Content');
else header('HTTP/1.1 200 OK');
header("Content-Type: video/mp4");
header('Content-Length:'.($end-$begin));
header("Content-Range: bytes $begin-$end/$size");
$cur=$begin;
fseek($fm,$begin,0);
while(!feof($fm)&&$cur<$end&&(connection_status()==0)) {
print fread($fm,min(1024*16,$end-$cur));
$cur+=1024*16;
usleep(1000);
}
die();
}
И HTML очень прост:
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<title>test</title>
</head>
<body>
<video controls>
<source src="./video.php" type="video/mp4">
</video>
</body>
</html>
Вы можете увидеть, что я сделал здесь.
PS Извините за видео. :) Я не мог найти еще один.