Я хотел бы показать 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) Вы не можете создать правильное видео. Попробуйте использовать такую строку:
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 Извините за видео. 🙂 Я не мог найти anoter один.