PHP: iPad ne joue pas les vidéos MP4 livré en PHP, mais si on y accède directement, il n'
Je suis en train d'essayer de trouver une solution à ce problème depuis quelques jours déjà, j'ai essayé tous les conseils que j'ai pu trouver ici sur stackoverflow et d'autres plates-formes. Et encore, il n'y a pas de solution.
Je suis intégration d'une vidéo via la balise vidéo HTML5:
<video poster="thumb.png" controls="controls" preload="none" width="640" height="480">
<source src="provider.php?secure=12345" type="video/mp4">
</video>
J'ai essayer de remettre le fichier vidéo MP4 en PHP au lieu de le relier directement. Lier le fichier mp4 directement travaille et joue le fichier!
Test:
- le fichier vidéo: https://github.com/q2apro/videotest-ipad/raw/master/video.mp4 (joue sur iPad)
- la vidéo de chargement du fichier en PHP avec les mêmes en-têtes: https://github.com/q2apro/videotest-ipad/blob/master/test-headers.php (ne pas jouer sur iPad) - Code source
- la vidéo de chargement du fichier en PHP avec le Byte-range: https://github.com/q2apro/videotest-ipad/blob/master/test-byterange.php (ne pas jouer sur iPad) - Code source
- la vidéo de chargement du fichier en PHP avec des Plages d'Octet (un autre script): https://github.com/q2apro/videotest-ipad/blob/master/test-byterange-2.php (pas de jeu sur un iPad, d'alerte "L'opération n'a pas pu être terminée") - Code source
Notes:
- tous les liens ci-dessus sont directement accès/lire le fichier vidéo, sans balise embed
- vidéo fonctionne sur tous les navigateurs dans Windows (mais pas dans Safari/Chrome sur iPad, probablement pas iPhone)
Ma Configuration:
- test de l'appareil: iPad iOS 6 (je n'ai pas de mac, impossible de débogage)
- iPad avec Safari et Chrome (essayé les deux navigateurs)
- mon serveur d'hébergement mutualisé à partir de domainfactory
- outil de débogage: Firefox 29 Développeur Web Console /WIN7
La .htaccess
dans le dossier test définit le type MIME et Accept-Ranges:
AddType video/mp4 .mp4
<IfModule mod_headers.c>
Header set Accept-Ranges "bytes"
</IfModule>
Même si j'ai créé le même en-tête (comparer test Url 1. et 2.), l'iPad n'est pas la lecture du fichier par le biais de l'PHP demande.
Au lieu de cela, je reçois toujours ce strikedthrough bouton de lecture:
Les en-têtes de 1. (direct mp4 appel):
Les en-têtes de 2. Les mêmes en-têtes ci-dessus, mais mis en place par PHP (mp4 livré par PHP):
--
J'ai aussi essayé la lecture de tout fichier vidéo et de l'envoyer au navigateur à l'aide de PHP fread(), fpassthru() et file_get_contents() mais l'iPad est toujours montrant le pas-jouer-icône.
--
Mon hébergeur n'offre pas de Connection keep-alive, cela pourrait-il être un problème?
Est ce que le iPad de l'interprétation .php différent .mp4?
Quelqu'un peut-il m'aider à sortir de la douleur? Je suis totalement coincé.
PS: Ce que j'ai essayé à prendre en compte:
- Plage d'octets demandes (206 partial content) Zero un Zero deux Zero trois
- corriger l'encodage vidéo Zero quatre
- utilisé d'autres vidéos encodées lors des tests de
- désactivé zlib.output_compression dans les scripts php
Mise à JOUR: Console de Débogage
J'ai finalement obtenu un MAC d'un ami, connecté à l'iPad, a ouvert la Console de Débogage dans Safari sur Mac, chargé de la page sur l'iPad et vérifié les messages d'erreur apparaissant sur le Mac (btw, comment plus compliqué apple pourrait nous forcer à développer...). Pour tous les scripts de test, cette erreur s'affiche:
Failed to load resource: Plug-in handled load
OriginalL'auteur Kai Noack | 2014-06-04
Vous devez vous connecter pour publier un commentaire.
Wow, c'était dur!
1. Premier Problème majeur
Il s'est avéré être l'encodage n'problème, mais un problème avec le conteneur mp4 en-tête défini durant le processus de conversion vidéo iPad n'a visiblement un problème avec les vidéos MP4 qui sont préparés pour progressive streaming.
J'ai d'abord découvert que, dans une conversation ici. Après la conversion d'une vidéo que j'ai toujours utilisé l'outil MP4 de Démarrage Rapide pour préparer le fichier vidéo pour le progrès des flux. Cela était nécessaire pour diffuser le fichier vidéo vers le Lecteur Flash en morceaux (progressivement), donc il n'a pas charger le fichier en entier (et l'utilisateur doit attendre).
Avec Frein à main il y a un paramètre similaire, qui est appelé
Web Optimized
. Il en fait de même:Si vous activez ce et convertir votre vidéo, l'iPad ne pourra pas lire le fichier vidéo! Au lieu de cela, vous obtenez l'erreur "l'opération n'a pas pu être terminée".
Découvrez et testez-le vous-même: vidéo de ressources de test.
2. Deuxième Problème
En environnement de production, j'ai toujours utilisé PHP pour vérifier le referer. Comme je l'ai constaté, l'iPad n'envoie pas le referer de l'information. Cela empêche également le streaming et vous verrez aussi la ne peut pas-jouer-le symbole (barré-à travers l'icône de lecture).
3. Troisième Problème
Je ne pouvais pas savoir pourquoi, mais l'iPad accepte uniquement la vidéo en streaming à partir de ce script http://ideone.com/NPSlw5
J'espère que cette information aidera les autres à faire face au problème.
Mise à jour: Trois mois plus tard, en environnement de production, certains de mes utilisateurs ont signalé des problèmes de lecture. Il semble y avoir un autre problème avec Safari. Je leur ai conseillé d'utiliser Chrome pour iPad, ce fixe.
PS: UN couple de jours, de la recherche et de tracas seulement pour lire un fichier vidéo, qui, par ailleurs, fonctionne sur tous les autres appareils. Cela prouve encore une fois pour moi que Apple a obtenu de succès simplement en raison de la grande marketing, et non pas en raison d'un excellent logiciel.
Très beau travail sur cette. J'ai suivi le même processus qu'à la fin jusqu'ici, et votre code pour l'étape 3, finalement résolu mon problème. Si je comprends bien, iOS veut un soutien pour les plages d'octet (aka "je ne veux pas le fichier en entier, juste des morceaux spécifiques et je vais vous demander pour ceux dont j'ai besoin") et apparemment, il veut commencer à recevoir un flux de blocs qui a été l'essentiel de la différence entre ton code et ce que j'ai été à l'aide. Ce QA a confirmé la dernière partie de mon problème: stackoverflow.com/questions/18103103/.... Cheers!
Pour mon cas d'utilisation (les fichiers mp3, servi avec un script similaire comme ci-dessus), tout fonctionne parfaitement sauf pour alors que la chanson semble à charger tous, mais le dernier morceau. (ie. 3:26 3:27). Le html5 audio player refuse de passer au morceau suivant. Toute idée d'il y a des façons de gérer le service le dernier morceau différemment? Le script fonctionne sur tous les autres navigateurs.
J'ai changé la déclaration de $plages[1] pour simplement $filesize (pas de -1) et semble résoudre le problème pour certains fichiers, mais pas les autres....
OriginalL'auteur Kai Noack