2013-06-03 6 views
0

En bref: Je dois encoder une petite quantité d'images vidéo et de les assembler en face d'un flux h.264 beaucoup plus sans réencodage dudit courant.h264 Encode pour correspondre à flux existant

Les détails: Je reçois un flux de transport de plusieurs Go contenant un h.264 es et un audio es. Actuellement, les flux h.264 sont toujours générés en utilisant x264, et je peux supposer que ce sera le cas dans le futur. Maintenant, je dois préfixer quelques images vidéo à ce flux, mais je ne suis pas autorisé à décoder/coder l'ensemble du flux; ce qui me laisse la seule option pour trouver les paramètres exacts dont j'ai besoin pour passer x264_encoder_open afin que les deux flux correspondent.

Actuellement ce que je fais est:

  1. démultiplexeur ts originaux et extraire les paquets h.264 NAL.
  2. Lorsque je trouve le premier paquet SEI "données utilisateur non enregistrées", je l'analyse et trouve un tas de paramètres x264.
  3. Utilisez libavcodec pour commencer le décodage de la vidéo. Cela me donne les dimensions de l'image et le profil et le niveau h264 dans la structure AVCodecContext.
  4. Correspond à tout cela du mieux que je peux dans la structure x264_param_t.

Je peux faire un peu de codage avec cela, et la vidéo encodée joue correctement jusqu'au point de jonction. Lorsque VLC atteint le point de point, il commence à lancer la séquence suivante de messages et peu de temps après les arrêts jeu:

[h264 @ 0x7fe36cd75be0] decode_slice_header error 
[h264 @ 0x7fe36cd75be0] no frame! 
[h264 @ 0x7fe36ccc9080] Width/height changing with threads is not implemented. Update your Libav version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented. 

qui montre clairement que mes images encodées ne correspondent pas à celles d'origine. J'ai parcouru le code source et n'arrive pas à trouver un moyen de le faire. Ce que j'ai actuellement (en plus de ne pas travailler), implique beaucoup de conjectures, donc même si je pouvais le faire fonctionner avec la poignée d'exemples de fichiers que j'ai, je serais effrayé de déployer cela dans les serveurs de production. Donc, la question évidente est la suivante: existe-t-il un moyen sûr et formel de le faire?

Merci à l'avance

Répondre

0

Enfin, je l'ai résolu moi-même. Il s'avère que vous avez seulement besoin de faire correspondre la taille de l'image et le ratio d'aspect, de sorte qu'il peut être aussi simple que:

x264_param_t xparam ; 
x264_param_default(&xparam); 

xparam.i_width   = width ; 
xparam.i_height   = height ; 
xparam.vui.i_sar_height = 1  ; 
xparam.vui.i_sar_width = 1  ; 

x264_t * x264 = x264_encoder_open(&xparam); 
Questions connexes