Je travaille sur un service de télévision en ligne. L'un des objectifs est que la vidéo soit lue sans plug-ins de navigateur supplémentaires (à l'exception de Flash).
J'ai décidé d'utiliser MP4, car il est pris en charge par la majorité des navigateurs HTML5 et par Flash (pour le repli). Les vidéos sont transcodées depuis ASF sur un serveur par FFMpeg.
Cependant, j'ai trouvé que MP4 ne peut pas être diffusé en direct car il a un moov atom pour les métadonnées qui doivent spécifier la longueur. FFMpeg ne peut pas diffuser directement mp4 vers stdout, car il place le moov à la fin du fichier. ( Le transcodage et la diffusion en direct de MP4 fonctionnent dans Android mais échoue dans Flash Player avec l'erreur NetStream.Play.FileStructureInvalid )
Bien sûr, MPEG-TS existe, mais il n'est pas pris en charge par HTML5 <video>
.
Ce que j'ai pensé est une méthode pour transcoder le flux en temps réel vers MP4, et à chaque nouvelle requête HTTP pour cela, envoyez d'abord un moov qui spécifie un nombre très long pour la longueur de la vidéo, puis commencez à envoyer le reste de la Fichier MP4.
Est-il possible d'utiliser MP4 pour le streaming de cette façon?
Après quelques recherches et la réponse de l'av501, je comprends que les tailles des cadres doivent être connues pour que cela fonctionne.
Le fichier mp4 peut-il être segmenté en parties plus petites afin de pouvoir être diffusé?
Bien sûr, passer à un autre conteneur/format est une option, mais le seul format compatible avec Flash et HTML5 est mp4/h264, donc si je dois prendre en charge les deux, je devrai transcoder deux fois.
Voici mes pensées, les gars, certains pourraient être à droite sur d'autres. Je plaide l'ignorance parce que personne n'a vraiment documenté ce processus complètement, c'est une supposition éclairée.
AvAssetWriter n'encode que dans un fichier, il ne semble y avoir aucun moyen de mettre la vidéo encodée en mémoire. Lire le fichier pendant qu'il est écrit dans un thread d'arrière-plan pour dire qu'une socket entraîne un flux élémentaire, c'est essentiellement un m4v, qui est un conteneur avec des données h264/acc, mais pas d'atomes moov. (en d'autres termes, aucun en-tête) Non Apple fourni peut lire ce flux, mais un lecteur modifié basé sur ffplay devrait être en mesure de décoder et de lire le flux. Cela devrait fonctionner, car ffplay utilise libavformat qui peut décoder les flux élémentaires, une mise en garde car il n'y a pas d'informations sur la longueur du fichier, certaines choses doivent être déterminées par le jeu, le DTS et PTS et le joueur ne peut pas rechercher dans le fichier .
Alternativement, le naul brut du flux m4v peut être utilisé pour construire un flux rtmp.
Si vous souhaitez en discuter davantage, vous pouvez me contacter directement.
Comment vous obtenez les données.
Étant donné que vous devrez de toute façon reconstruire le fichier côté réception, je suppose que vous pouvez simplement le segmenter, Steve Mcfarin a écrit un petit appleSegmentedEcorder que vous pouvez trouver sur sa page github, cela résout certains des problèmes pour les atomes moov depuis que vous avoir toutes les informations sur le fichier.
Vous pouvez utiliser un MP4 fragmenté. Un fichier MP4 fragmenté est construit comme suit:
moov [moof mdat]+
La boîte moov contient alors uniquement des informations de base sur les pistes (combien, leur type, l'initialisation du codec, etc.) mais aucune information sur les échantillons de la piste. Les informations sur les emplacements et la taille des échantillons se trouvent dans la boîte moof, chaque boîte moof est suivie d'un mdat qui contient les échantillons comme décrit dans la boîte moof précédente. En règle générale, on choisit la longueur d'une paire (moof, mdat) à environ 2,4 ou 8 secondes (il n'y a pas de spécification à ce sujet mais ces valeurs semblent raisonnables pour la plupart des cas d'utilisation).
C'est un moyen de construire un flux MP4 sans fin.
Non, ce n'est pas seulement la très longue longueur .. vous devez 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 encodeurs].
En regardant simplement le 2e paragraphe de votre question ("Les vidéos sont transcodées depuis ASF sur un serveur par ffmpeg."), Vous avez mentionné que vous utilisez ffmpeg pour transcoder des vidéos sur le serveur.
Utilisez qt-faststart ou MP4Box pour placer MOOV atom au début du fichier. (Assurez-vous également que l'utilisation du codec H264 Video & AAC Audio pour un support universel)
J'espère que cela vous a aidé.