57 votes

Transcodage fMP4 à HLS lors de l'écriture sur iOS à l'aide de FFmpeg

TL;DR

Je veux convertir fMP4 fragments de TS les segments (HLS) que les fragments sont écrits à l'aide de FFmpeg sur un appareil iOS.

Pourquoi?

Je suis en train de réaliser en direct de téléchargement sur iOS, tout en conservant une parfaite HD copie locale.

Ce que j'ai essayé

  1. Rolling AVAssetWriters où chacun écrit pendant 8 secondes, puis la concaténation de la MP4s ensemble via FFmpeg.

    Ce qui s'est passé - Il y a des soubresauts de l'audio et de la vidéo à la fois. J'ai identifié 3 raisons à cela.

    1) préparation de la surface des cadres pour l'audio, écrit par l'encodeur AAC créer des lacunes.

    2) étant donné que les images vidéo sont de 33,33 ms de long, et de trames audio 0.022 ms de long, il est possible pour eux de ne pas s'aligner à la fin d'un fichier.

    3) L'absence de cadre précis d'encodage présent sur Mac OS, mais n'est pas disponible pour iOS Détails Ici

  2. FFmpeg multiplexage un grand uniquement à la vidéo MP4 fichier audio raw dans TS les segments. Le travail a été basé sur le Kickflip SDK

    Ce qui s'est passé - à Chaque fois dans un tout en un audio uniquement les fichier téléchargés, avec pas de vidéo que ce soit. Jamais en mesure de le reproduire en interne, mais il était assez dérangeant pour nos utilisateurs lorsqu'ils n'ont pas d'enregistrer ce qu'ils ont pensé qu'ils ont fait. Il y avait aussi des questions précises de la recherche sur la finale de segments, presque comme le TS segments ont été incorrectement horodaté.

Ce que je pense maintenant

Apple pousse fMP4 lors de la WWDC de cette année (2016) et je n'avais pas regardé beaucoup à tous avant que. Depuis un fMP4 fichier peut être lu, et a joué alors qu' il a été écrit, j'ai pensé qu'il serait possible pour FFmpeg pour transcoder le fichier tel qu'il a été écrit ainsi, aussi longtemps que nous attendions envoyer les octets de FFmpeg jusqu'à ce que chaque fragment à l'intérieur du fichier est terminé.

Cependant, je ne suis pas assez familier avec la Version de l'API C, je n'ai utilisé que brièvement à l'intérieur de tentative de #2.

Ce que j'ai besoin de vous

  1. Est-ce une solution viable? Est ce que quelqu'un assez familiers avec fMP4 savoir si je peux réellement accomplir cette mission?
  2. Comment vais-je savoir que AVFoundation a terminé l'écriture d'un fragment dans le fichier pour que je puisse pipe dans FFmpeg?
  3. Comment puis-je récupérer des données à partir d'un fichier sur le disque, morceau à la fois, la passer dans FFmpeg et avoir cracher TS les segments?

2voto

Tijn Porcelijn Points 11

Strictement parlant, vous n'avez pas besoin de transcoder les fmp4 si elle contient h264+aac, vous avez juste besoin de remballer les données de l'échantillon comme TS. (à l'aide d' ffmpeg -codec copy ou gpac)

Wrt. l'alignement (1.2) je suppose que tout dépend de vos paramètres de l'encodeur (cadence, taux d'échantillonnage et la taille de GOP). Il est certainement possible de faire en sorte que l'audio et la vidéo aligner exactement au fragment des frontières (voir par exemple: ce tableau). Si vous ciblez iOS, je vous conseille d'utiliser le protocole HLS protocol version 3 (ou 4) permettant la synchronisation pour être représenté avec plus de précision. Cela vous permet également de diffuser de l'audio et de la vidéo séparément (non multiplexé).

Je crois que ffmpeg devrait être capable de pousser un live fmp4 flux (ie. à l'aide d'une longue HTTP POST), mais la diffusion nécessite l'origine des logiciels pour faire quelque chose de significatif avec elle (c'est à dire. flux HLS).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X