Ответ 1
Ничего себе, это было сложно!
1. Первая серьезная проблема
Оказалось, что это не проблема с кодировкой, а проблема с заголовком контейнера mp4, установленным во время процесса преобразования видео. У iPad, очевидно, проблема с видеороликами MP4, которые подготовлены для прогрессивной потоковой передачи.
Сначала я обнаружил, что в беседе здесь. После преобразования видео я всегда использовал инструмент Быстрый запуск MP4, чтобы подготовить видеофайл для прогрессивного потока. Это было необходимо для потоковой передачи видеофайла на Flash Player по частям (постепенно), поэтому он не загружал весь файл (и пользователю пришлось ждать).
С Handbrake существует аналогичная настройка, которая называется Web Optimized
. Он делает то же самое:
Web Optimized
Also known as "Fast Start"
This places the container header at the start of the file, optimizing it for streaming across the web.
Если вы включите это и конвертируете свое видео, iPad не будет воспроизводить видеофайл! Вместо этого вы получите сообщение об ошибке "Операция не может быть завершена".
Проверьте и протестируйте его самостоятельно: ресурсы для тестирования видео.
2. Вторая проблема
В рабочей среде я всегда использовал PHP для проверки реферирования. Как я узнал, iPad не отправляет информацию о реферере. Это также предотвращает потоковое воспроизведение, и вы также увидите символ "не может играть" (значок с пропущенным воспроизведением).
3. Третья проблема
Я не мог понять, почему, но iPad принимает только потоковое видео из этого script http://ideone.com/NPSlw5
<?php
// disable zlib so that progress bar of player shows up correctly
if(ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
$folder = '.';
$filename = 'video.mp4';
$path = $folder.'/'.$filename;
// from: http://licson.net/post/stream-videos-php/
if (file_exists($path)) {
// Clears the cache and prevent unwanted output
ob_clean();
$mime = "video/mp4"; // The MIME type of the file, this should be replaced with your own.
$size = filesize($path); // The size of the file
// Send the content type header
header('Content-type: ' . $mime);
// Check if it a HTTP range request
if(isset($_SERVER['HTTP_RANGE'])){
// Parse the range header to get the byte offset
$ranges = array_map(
'intval', // Parse the parts into integer
explode(
'-', // The range separator
substr($_SERVER['HTTP_RANGE'], 6) // Skip the `bytes=` part of the header
)
);
// If the last range param is empty, it means the EOF (End of File)
if(!$ranges[1]){
$ranges[1] = $size - 1;
}
// Send the appropriate headers
header('HTTP/1.1 206 Partial Content');
header('Accept-Ranges: bytes');
header('Content-Length: ' . ($ranges[1] - $ranges[0])); // The size of the range
// Send the ranges we offered
header(
sprintf(
'Content-Range: bytes %d-%d/%d', // The header format
$ranges[0], // The start range
$ranges[1], // The end range
$size // Total size of the file
)
);
// It time to output the file
$f = fopen($path, 'rb'); // Open the file in binary mode
$chunkSize = 8192; // The size of each chunk to output
// Seek to the requested start range
fseek($f, $ranges[0]);
// Start outputting the data
while(true){
// Check if we have outputted all the data requested
if(ftell($f) >= $ranges[1]){
break;
}
// Output the data
echo fread($f, $chunkSize);
// Flush the buffer immediately
@ob_flush();
flush();
}
}
else {
// It not a range request, output the file anyway
header('Content-Length: ' . $size);
// Read the file
@readfile($path);
// and flush the buffer
@ob_flush();
flush();
}
}
die();
?>
Я надеюсь, что эта информация поможет другим справиться с этой проблемой.
Обновление: Спустя три месяца в производственной среде некоторые из моих пользователей по-прежнему сообщали о проблемах воспроизведения. Кажется, что еще одна проблема с Safari. Я посоветовал им использовать Chrome для iPad, это исправило его.
PS: Пару дней исследований и хлопот только для воспроизведения видеофайла, который, кстати, работает на всех других устройствах. Это снова доказывает мне, что Apple добилась успеха только из-за большого маркетинга, а не из-за большого программного обеспечения.