MP4 joue quand on y accède directement, mais pas lors de la lecture par le biais de PHP, sur iOS
J'utilise un script PHP pour valider vidéo les demandes avant de les servir. Ce script fonctionne comme prévu sur le bureau, avec Safari et Chrome. Mais sur iOS, je reçois une fracture de la touche play.
Je suis sûr que la vidéo est correctement codé pour iPhone/iPad, parce que quand j'y accéder directement, il fonctionne comme prévu.
Pertinentes du code PHP:
$file_name = 'test-video.mp4';
$file_size = (string)(filesize($file_name));
header('Content-Type: video/mp4');
header('Content-Length: '.$file_size);
readfile_chunked($file_name);
exit;
(readfile_chunked()
est similaire à readfile()
mais pour les très gros fichiers, trouvé dans les commentaires sur le manuel PHP page: http://php.net/manual/en/function.readfile.php. Dans tous les cas, test-video.mp4
est seulement ~5 MO, ce qui est inférieur à la limite de la mémoire, et dans ce cas je peut effectivement se substituer à la normale readfile()
et produit exactement le même comportement.)
Les en-têtes que j'obtiens lorsque j'ai accès test-video.mp4
directement sont:
Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:5558749
Content-Type:video/mp4
Date:Sun, 27 Jun 2010 21:02:09 GMT
Etag:"1c04757-54d1dd-489944c5a6400"
Keep-Alive:timeout=10, max=30
Last-Modified:Tue, 22 Jun 2010 01:25:36 GMT
Server:Apache/2.2.15 (CentOS) mod_ssl/2.2.15 0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635
Les en-têtes du script PHP sont:
Connection:Keep-Alive
Content-Disposition:inline; filename="test-video.mp4"
Content-Length:5558749
Content-Type:video/mp4
Date:Sun, 27 Jun 2010 21:03:32 GMT
Keep-Alive:timeout=10, max=15
Server:Apache/2.2.15 (CentOS) mod_ssl/2.2.15 0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635
X-Powered-By:PHP/5.2.13
J'ai essayé beaucoup de différentes permutations des en-têtes, même correspondant exactement à ceux d'une demande directe, en vain.
Quelqu'un a eu le succès servant de vidéo HTML5 par le biais de PHP, sur iOS?
[Note: je voudrais essayer d'utiliser X-Sendfile, mais le site est sur un ordinateur hôte partagé avec un accès très limité.]
EDIT: j'ai lu qu'iOS peuvent être sensibles sur les extensions de fichier, j'ai donc essayé la configuration d'une règle de réécriture qui réécrit MP4 demandes de retour à mon premier script PHP, mais cela n'a pas aide non plus.
- Sais que c'est une vieille question, mais, il y a un problème avec google Chrome voir Chrome question - 206 Partial content & Contenu de gamme les en-Têtes
Vous devez vous connecter pour publier un commentaire.
Si vous vous occupez vous-même comme cela, alors vous aurez besoin pour gérer les demandes de plage d'octets de vous.
rangeDownload()
fonction de l'Appendice A de l'article suivant: mobiforge.com/developing/story/content-delivery-mobile-devices (Ce qui est cool à propos de cette fonction est qu'elle permet également à l'utilisateur de commencer la lecture à partir de n'importe quel point dans la vidéo, simplement en cliquant sur le calendrier.) Je pense que j'ai été particulièrement troublé par le problème ici, car il a fonctionné parfaitement sur le bureau, tandis que iOS a ce byte-range exigence.Essayer:
Si vous lisez le fichier à partir de l'url http au lieu de filsize() fonction-vous utilisateur code ci-dessous pour obtenir la taille du fichier
Veuillez noter que ce code (https://mobiforge.com/design-development/content-delivery-mobile-devices) est une bouée de sauvetage. Cependant, être à l'affût de la ligne
"if ($gamme{0} == '-'){" ou "if ($range0 == '-'){"
il devrait être
if ($gamme[0] == '-'){
Cette faute de frappe a entraîné un très long temps à essayer de comprendre pourquoi il ne fonctionne pas.
J'ai eu des problème avec ce code.
Correctif:
Comme cela a été indiqué ci-dessus pour écouter ou la lecture de vidéos MP4 à l'aide de PHP, vous aurez besoin de gérer octet plages si vous souhaitez une bonne lecture sur Safari et iOS.
rangeDownload()
fonction mentionnés dans les réponses précédentes ne le travail assez bien.Je veux mentionner un autre morceau de ce puzzle - assurez-vous que la source de la vidéo se termine avec
.mp4
comme dans<video source="url/yourfile.php/referenceForFile.mp4">
. Cela rend le navigateur chose que c'est un fichier vidéo, et il commence à le traiter comme un.À l'intérieur de
yourfile.php
, vous pourriez saisir la référence d'entrée pour votre fichier à l'aide de$_SERVER['PATH_INFO']
ou dansREQUEST_URI
. Pas besoin de passer comme un?id=someId.mp4
, direct slash approche ressemble plus à un vrai fichier.Pour résumer, à partir de mon expérience au service d'un fichier vidéo à partir de PHP correctement, vous aurez besoin de:
moov atom
au début du fichier (vous pouvez utiliser ffmpeg-movflags +faststart
ouMP4Box
)<video source="...file.mp4">
Source attribut de la balise vidéo doit ressembler à un.mp4
fichier. Sans cela, mes vidéos ont été seulement de jouer dans google Chrome, et pas dans Safari/iOS.videojs
J'ai écrit ce basé sur mon expérience au service des milliers de vidéos sur ma vidéo de musique de site web. Alors que cela pourrait ne pas être le cas pour tous, mais j'ai trouvé ce cross-browser et de la croix-installation de périphérique fonctionne comme prévu.