Diffusion en direct sur MP4

je travaille sur un service de télévision en ligne. Un des objectifs est que la vidéo soit jouée sans aucun plug-ins de navigateur supplémentaire (sauf pour Flash).

j'ai décidé d'utiliser MP4, car il est supporté par la majorité des navigateurs HTML5 et par Flash (pour repli). Les vidéos sont transcodées depuis ASF sur un serveur par FFMpeg.

cependant, J'ai trouvé que MP4 ne peut pas être LIVE-streamé parce qu'il a un atome moov pour les métadonnées qui doit spécifier le longueur. FFMpeg ne peut pas directement streamer mp4 vers stdout, car il place le moov à la fin du fichier. ( Live transcodage et la diffusion en continu de MP4 fonctionne dans Android, mais échoue dans Flash player avec NetStream.Jouer.FileStructureInvalid error )

bien sûr, MPEG-TS existe, mais il n'est pas supporté par HTML5 <video> .

ce que j'ai pensé est une méthode pour transcoder le flux en temps réel vers MP4, et sur 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 du fichier MP4.

est-il possible d'utiliser MP4 pour le streaming de cette façon?

après quelques recherches et la réponse d'av501, je comprends que les tailles des cadres doivent être connues pour qu'il puisse fonctionner.

le fichier mp4 peut-il être segmenté en plus petites parties pour qu'il puisse être diffusé en continu?

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 supporter les deux, je devrais transcoder deux fois.

33
demandé sur TylerH 2012-10-22 15:29:32

4 réponses

voilà ce que je pense les gars, il y en a peut-être d'autres qui sont loin. Je plaide l'ignorance parce que personne n'a vraiment documenté ce processus complètement, c'est tout une supposition instruite.

AvAssetWriter encode seulement à un fichier, il semble qu'il n'y ait aucun moyen d'obtenir la vidéo encodée à la mémoire. Lire le fichier pendant qu'il est écrit à partir d'un fil d'arrière-plan pour dire une socket résultats dans un flux élémentaire, il s'agit essentiellement d'un m4v, qui est un conteneur avec h264 / acc mdata, mais pas d'atomes moov. (en d'autres mots, aucun en-tête de) Aucun lecteur fourni par apple ne peut lire ce flux, mais un lecteur modifié basé sur ffplay devrait pouvoir décoder et lire le flux. Cela devrait fonctionner, parce que ffplay utilise libavformat qui peut décoder les flux élémentaires, une mise en garde puisqu'il n'y a pas d'information de longueur de fichier, certaines choses doivent être déterminées par le jeu, les DTS et les PTS et aussi le joueur ne peut pas chercher dans le fichier.

alternativement le naufrage brut du M4V stream peut être utilisé pour construire un flux rtmp.

si vous voulez discuter davantage, vous pouvez me contacter directement.

Comment obtenir les données.

puisque vous allez devoir reconstruire le fichier du côté de la réception de toute façon, je suppose que vous pourriez juste un peu 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 puisque vous avez tout le fichier info.

4
répondu Michelle Cannon 2012-12-10 19:42:56

vous pouvez utiliser fragmented MP4. Un fichier MP4 fragmenté est construit comme suit:

moov [moof mdat]+

la boîte moov ne contient alors que des informations de base sur les pistes (nombre, type , initialisation du codec, etc.) mais pas d'informations sur les échantillons dans la piste. Les informations sur l'emplacement des échantillons et la taille des échantillons sont 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 choisissez la longueur de la paire a (moof, mdat) pour être autour de 2,4 ou 8 secondes (il n'y a pas de spécification sur cela, mais ces valeurs semblent être raisonnables pour la plupart des usecases).

c'est une façon de construire un flux MP4 sans fin.

18
répondu Sebastian Annies 2013-01-28 08:37:18

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 codeurs].

2
répondu av501 2012-10-23 09:11:14

je regarde juste le 2ème paragraphe de votre question ("les vidéos sont transcodées de ASF sur un serveur par ffmpeg."), vous avez mentionné que vous utilisez ffmpeg pour transcoder des vidéos sur le serveur.

utilisez qt-fastart ou MP4Box pour placer MOOV atom au début du fichier. (assurez-vous également que L'utilisation H264 Video & AAC Audio codec pour le soutien universel)

J'espère que cela vous a aidé.

0
répondu mrsatish 2013-01-02 11:00:00