processus de flux vidéo à partir de la mémoire tampon
J'ai besoin d'analyser un flux vidéo (mpeg ts) de protocole réseau propriétaire (qui je sais déjà comment faire) et puis je voudrais utiliser OpenCV pour traiter le flux vidéo en images. Je sais comment utiliser cv::VideoCapture à partir d'un fichier ou d'une URL standard, mais je voudrais d'installation d'OpenCV pour lire à partir d'un tampon(s) dans la mémoire où je peux stocker le flux de données vidéo jusqu'à ce qu'il est nécessaire. Est-il un moyen de configurer un appel de retour de la méthode (ou tout autre interfrace), de sorte que je peux encore utiliser le cv::VideoCapture objet? Est-il un meilleur moyen d'atteindre le traitement de la vidéo avec l'écrire dans un fichier, puis re-lecture. Je voudrais aussi divertir à l'aide de FFMPEG directement si c'est un meilleur choix. Je pense que je peux convertir AVFrames Tapis en cas de besoin.
le flux vidéo normale mpeg ts flux une fois que j'ai extraite à partir de la propriété d'encapsulation. Je veux utiliser les outils existants (OpenCV de préférence) pour décoder le flux de transport et des images vidéo.
Voici un exemple de comment-pour capturer un flux vidéo avec OpenCV, codent pour un tampon comme mpeg-4, puis deocde à partir de la mémoire tampon: dimitri-christodoulou.blogspot.com/2012/02/...
OriginalL'auteur Dan | 2011-03-08
Vous devez vous connecter pour publier un commentaire.
J'avais un besoin similaire récemment. Je cherchais un moyen d'OpenCV pour lire une vidéo qui était déjà en mémoire, mais sans jamais avoir à écrire le fichier vidéo sur le disque. J'ai trouvé que la version de l'interface prend déjà en charge de ce à travers
av_open_input_stream
. Il est juste un peu plus de travail de préparation nécessaire par rapport à laav_open_input_file
appel dans OpenCV pour ouvrir un fichier.Entre les deux sites web suivants, j'ai été en mesure de rassembler une solution de travail à l'aide de l'ffmpeg appels. Veuillez vous référer à l'information sur ces sites web pour plus de détails:
http://ffmpeg.arrozcru.org/forum/viewtopic.php?f=8&t=1170
http://cdry.wordpress.com/2009/09/09/using-custom-io-callbacks-with-ffmpeg/
Pour le faire fonctionner dans OpenCV, j'ai fini par l'ajout d'une nouvelle fonction pour la
CvCapture_FFMPEG
classe:J'ai fourni un accès à travers un nouvel appel d'API dans le highgui DLL, semblable à
cvCreateFileCapture
. La nouvelleopenBuffer
fonction est essentiellement le même que leopen( const char* _filename )
fonction avec la différence suivante:est remplacé par:
Aussi, assurez-vous d'appeler
av_close_input_stream
dans leCvCapture_FFMPEG::close()
fonction au lieu deav_close_input_file
dans cette situation.Maintenant la
read_buffer
fonction de callback qui est passé àav_alloc_put_byte
que j'ai définie comme:Cette solution suppose la vidéo entière est contenue dans une mémoire tampon, et devrait probablement être tordu pour travailler avec des flux de données.
Donc, c'est ça! Btw, je suis en utilisant OpenCV la version 2.1 de sorte YMMV.
quelques remarques:
memcpy(probe_data.buf, data, 4096)
doit utiliser probe_data.buf_size pas 4096 (ou il va se planter pour des apports inférieurs à 4096).av_alloc_put_byte
a été renomméavio_alloc_context
OriginalL'auteur smoenssen