H. 264 conversion avec FFmpeg (à partir d'un flux RTP)

Environnement:

J'ai une Caméra IP, qui est capable d'envoyer des données via le protocole RTP dans un H. 264 format codé. Cette matière première en flux est enregistré à partir de l'ethernet. Avec les données que j'ai à travailler.

Objectif:

À la fin, je veux avoir un *.fichier mp4, qui je peux jouer avec le commun des lecteurs de Médias (comme VLC ou Windows MP).

Qu'ai-je fait jusqu'à présent:

Je prends que les flux de données que j'ai et de l'analyser. Depuis que les données ont été transmises via le protocole RTP j'ai besoin de prendre soin de la NALE Octets, SPS et PPS.

1. Écrire un fichier raw

J'ai d'abord déterminer le type de chaque trame reçue sur Ethernet. Pour ce faire, je lis les deux premiers octets de chaque RTP Payload, afin que je puisse obtenir les 8 NALE de l'Unité de Bits, le Fragment de Type Bits et le Début, Réservé et Bit de Fin. Dans la charge utile, ils sont disposés comme suit:

Byte 1: [          3 NAL Unit Bits          | 5 Fragment Type Bits]
Byte 2: [Start Bit | Reserved Bit | End Bit | 5 NAL Unit Bits]

À partir de ce que je peux déterminer:

  • De début et de Fin de
    une Image de la Vidéo -> Start Bit et Bit de Fin
  • Type de la Charge utile -> 5 Fragment de Type Bits
  • NALE de l'Unité d'Octets

Le Fragment de types qui sont nécessaires dans mon cas sont:

Fragment Type  7 = SPS
Fragment Type  8 = PPS
Fragment Type 28 = Video Fragment

De la NALE Octets est créé par mettre la dernière Unité de Bits de l'Octet 1 et 2 ensemble.

Maintenant, selon la fragmentation de type I, procédez de la manière suivante:

SPS/PPS:

  1. Écrire la version NALE du Préfixe (0x00 0x00 0x01) et puis le SPS ou PPS données

Fragmentation avec un Bit de Départ

  1. Écrire NALE Préfixe
  2. Écrire NALE de l'Unité d'Octets
  3. Écrire restant données brutes

La Fragmentation sans Bit de Start

  1. Écrire des données brutes

Cela signifie que mon fichier raw ressemble à quelque chose comme ceci:

[NAL Prefix][SPS][NAL Prefix][PPS][NAL Prefix][NAL Unit Byte][Raw Video Data][Raw Video Data]....[NAL Prefix][NAL Unit Byte][Raw Video Data]...

Pour tous les PPS et SPS-je trouver dans mon flux de données, je viens d'écrire un dernier Préfixe ( 0x00 0x00 0x01 ) et puis la SPS/SPA lui-même.

Maintenant je ne peux pas jouer ces données avec certains media player, ce qui m'amène à :

2. Convertir le fichier

Car je voulais éviter de travailler beaucoup avec les codecs, je suis juste allé à l'utilisation d'une application existante -> FFmpeg. Ce que j'appelle avec ces paramètres:

ffmpeg.exe -f h264 -i <RawInputFile> -vcodec copy -r 25 <OutPutFilename>.mp4

-f h264: Ce devrait dire ffmpeg, j'ai un h264 codé flux

-vcodec copy: Citation de la page de manuel:

Force video codec to codec. Use the "copy" special value to tell that the raw codec data must be copied as is.

-r 25: Définit la fréquence de 25 images par seconde.

Quand je l'appelle ffmpeg avec ces paramètres-je obtenir un .Fichier mp4, qui je peux jouer avec VLC et Windows MP, si elle a effectivement travaille. Mais le fichier semble maintenant un peu différent de mon fichier raw.

Cela m'amène à ma question:

Qu'ai-je réellement faire?

Mon problème n'est pas qu'il ne fonctionne pas. J'ai juste envie/besoin de savoir ce que j'ai fait avec l'appel de ffmpeg. J'ai eu un raw H264 fichier que je ne pouvait pas jouer. Après l'utilisation de FFmpeg je peut jouer.

Il y a des différences entre le fichier raw original (que j'ai écrit) et celle écrite par FFmpeg:

  1. En-tête: Le Fichier FFmpeg a comme sujet de 0x30 Octets de l'en-Tête
  2. Pied de page: Le Fichier FFmpeg a également un pied de page
  3. Changé le Préfixe et 2 nouveaux Octets:

Tandis qu'une nouvelle Image de la Vidéo à partir du Fichier Raw a commencé comme
[NAL Prefix][NAL Unit Byte][Raw Video Data] dans le nouveau fichier, il ressemble à ceci:

[0x00 0x00][2 "Random" Bytes][NAL Unit Byte][Raw Video Data].....[0x00 0x00[2 other "Random" Bytes][NAL Unit Byte][Raw Video Data]...

Je comprends que le Flux Vidéo a besoin d'un format de conteneur (corrigez-moi si je me trompe, mais je suppose que le nouvel en-tête et pied de page sont responsables pour que). Mais pourquoi faut-il changer effectivement quelques Octets dans les données brutes? Il ne peut pas être certains de décodage depuis le ruisseau lui-même devriez obtenir décodés par le lecteur, et pas de ffmpeg.

Comme vous pouvez le voir je n'ai pas besoin d'une nouvelle solution pour mon problème est beaucoup plus une explication (pour que je puisse l'expliquer par moi-même). Ce n'ffmpeg? Et pourquoi faut-il changer quelques octets dans les données de la vidéo?

Avez-vous été en mesure de réaliser cela? Si oui, êtes-vous prêt à partager la solution? Merci!
Je suis également à la recherche de solution similaire. Pourriez-vous résoudre ce problème, vous souhaitez partager.

OriginalL'auteur Toby | 2012-07-18