Live streaming via MP4
Je suis en train de travailler sur un service de TÉLÉVISION en ligne. L'un des objectifs est de la vidéo pour être joué sans aucun plug-ins de navigateur (sauf pour le Flash).
J'ai décidé d'utiliser MP4, parce qu'elle est soutenue par la majorité des navigateurs HTML5 et Flash (de secours). Les vidéos sont transcodés d'ASF sur un serveur par FFMpeg.
Cependant, j'ai trouvé que MP4 ne peuvent pas être diffusées en direct parce qu'il a un moov atom pour les métadonnées qui a pour spécifier la longueur. FFMpeg ne peut pas directement en streaming mp4 to stdout, parce qu'il met le moov à la fin du fichier.
( En direct de transcodage et de streaming de MP4 fonctionne sous Android, mais échoue dans Flash player avec NetStream.Jouer.FileStructureInvalid erreur )
Bien sûr, MPEG-TS existe, mais il n'est pas pris en charge par HTML5 <video>
.
Ce que j'ai pensé, c'est une méthode de transcoder le flux en temps réel pour MP4, et à chaque nouvelle requête HTTP pour cela, envoyez d'abord un moov qui spécifie un très grand nombre pour la vidéo de la longueur, puis commencer à envoyer le reste de fichier MP4.
Est-il possible d'utiliser MP4 pour la lecture en continu de cette façon?
Après quelques recherches, et av501 réponse, je comprends que la taille des images doit être connu afin qu'il puisse fonctionner.
Peut le fichier mp4 être segmenté en parties plus petites de sorte qu'il peut être écoutés?
Bien sûr, de passer à un autre conteneur/format est une option, mais le seul format compatible avec Flash et HTML5 est mp4/h264, donc, si j'ai de soutenir à la fois, j'aurais à transcoder deux fois.
Vous devez vous connecter pour publier un commentaire.
Voici mes pensées quelques gars de il peut-être raison sur les autres de façon large. Je plaide l'ignorance, car nul n'a vraiment documenté ce processus entièrement, tout est une supposition éclairée.
AvAssetWriter uniquement code dans un fichier, il semble y avoir aucun moyen d'obtenir des données vidéo codées à la mémoire. De la lecture du fichier alors qu'il est en train d'être écrite à partir d'un thread d'arrière-plan à dire un socket résultats dans un flux élémentaire, il s'agit essentiellement d'un m4v, qui de son un récipient avec h264/acc mdata, mais pas de moov atomes. (en d'autres termes, en-tête)
Pas d'apple fourni joueur peut jouer à ce flux, mais une modification de joueur sur ffplay devrait être en mesure de décoder et lire le flux. Cela devrait fonctionner, parce que ffplay utilisation démultiplexeur qui peut décoder des flux élémentaires, une mise en garde, car il n'est pas la longueur du fichier info, certaines choses doivent être déterminés par le jeu, le DTS et le PTS et également le joueur ne peut pas aller chercher dans le fichier.
Sinon le raw naul de la m4v flux peuvent être utilisés pour construire un flux rtmp.
Si vous voulez discuter plus loin vous pouvez me contacter directement.
Comment vous obtenez les données.
Puisque vous allez avoir à reconstruire le fichier sur le côté de réception de toute façon, je suppose que vous pourriez juste une sorte de segment, Steve Mcfarin écrit un petit appleSegmentedEcorder vous pouvez trouver sur son github de page, ce qui résout certains problèmes pour moov atomes puisque vous disposez de toutes les informations sur le fichier.
Vous pouvez utiliser fragmenté MP4. La fragmentation du fichier MP4 est construit ainsi:
La boîte moov ne contient alors que des informations de base sur les pistes (nombre, leur type , leur initialisation du codec et ainsi de suite), mais aucune information sur les échantillons de la piste. Les informations sur les stations d'échantillonnage et tailles d'échantillons est dans le moof boîte, chaque moof zone est suivie par un mdat qui contient les échantillons comme décrit dans le précédent moof boîte. En règle générale, on choisir la longueur d'un (moof, mdat)-paire de autour de 2,4 ou 8 secondes (il n'y a pas d'indication à ce sujet, mais ces valeurs semblent être raisonnables pour la plupart des usecases).
C'est un moyen de construire un neverending MP4 flux.
Non, il n'est pas juste de la très longue durée.. vous besoin de connaître la taille exacte de chaque image pour créer l'en-tête dans un mp4. [c'est pourquoi il est créé à la fin par les différents codeurs].
Simplement en regardant le 2e para de votre question ("Les vidéos sont transcodés d'ASF sur un serveur par ffmpeg."), vous avez mentionné que vous êtes en utilisant ffmpeg pour transcoder les vidéos sur le serveur.
L'utilisation de qt-accéléré ou MP4Box à la place MOOV atom dans le début du fichier. (d'ailleurs vous assurez-vous que l'utilisation de la Vidéo H264 & codec Audio AAC pour support universel)
Espère que cela vous a aidé.