Pipe à cru OpenCV images de FFmpeg
Ici est assez simple exemple de la lecture d'une web-cam à l'aide d'OpenCV est bindings python:
'''capture.py'''
import cv, sys
cap = cv.CaptureFromCAM(0) # 0 is for /dev/video0
while True :
if not cv.GrabFrame(cap) : break
frame = cv.RetrieveFrame(cap)
sys.stdout.write( frame.tostring() )
Maintenant, je veux rediriger la sortie vers ffmpeg comme dans:
$ python capture.py | ffmpeg -f image2pipe -pix_fmt bgr8 -i - -s 640 x 480 foo.avi
Malheureusement, je ne peux pas obtenir le ffmpeg incantation magique tout à fait raison et il ne fonctionne pas avec
libavutil 50.15. 1 /50.15. 1 libavcodec 52.72. 2 /52.72. 2 démultiplexeur 52.64. 2 /52.64. 2 libavdevice 52. 2. 0 /52. 2. 0 libavfilter 1.19. 0 /1.19. 0 libswscale 0.11. 0 /0.11. 0 libpostproc 51. 2. 0 /51. 2. 0 Sortie de #0, avi, de 'out.avi: Stream #0.0: Vidéo: flv, yuv420p, 640 x 480, q=2-31, 19660 kb/s, 90k d'alcalinité, de 30 à confirmer [image2pipe @ 0x1508640]max_analyze_duration atteint [image2pipe @ 0x1508640]l'Estimation de la durée de débit, cela peut être inexacte Entrée #0, image2pipe, de la pipe:': Durée: N/A, bitrate: N/A Stream #0.0: Vidéo: 0x0000, bgr8, 25 fps, 25 tbr, 25 tbn, 25 tbc swScaler: 0 x 0 -> 640 x 480 est pas valide mise à l'échelle de la dimension
- Les images capturées sont certainement 640x480.
- Je suis sûr que l'ordre des pixels de l'image OpenCV type (IplImage) est GBR, un octet par canal. Au moins, c'est ce qui semble provenir de l'appareil.
Je ne suis pas ffmpeg gourou. Quelqu'un a fait cela avec succès?
- Oh man! L'idée de la tuyauterie de sortie de ffmpeg est très intelligent!
Vous devez vous connecter pour publier un commentaire.
Pris un tas de jongler, mais j'ai tout compris à l'aide de l'FFmpeg rawvideo demuxer:
Car il n'y a pas d'en-tête en raw vidéo en spécifiant le supposé paramètres de la vidéo, l'utilisateur doit spécifier dans l'ordre pour être en mesure de décoder correctement les données:
-framerate
Ensemble d'entrée fréquence d'image vidéo. La valeur par défaut est de 25.-pixel_format
Réglez l'entrée vidéo format de pixel. La valeur par défaut est yuv420p.-video_size
Réglez l'entrée vidéo de la taille. Il n'y a pas de valeur par défaut, cette valeur doit être spécifiée explicitement.Et voici un petit quelque chose supplémentaire pour les utilisateurs d'alimentation. Même chose, mais en utilisant VLC pour diffuser le live de la sortie sur le web, Flash format:
Edit:
Créer un stream webm utilisant ffmpeg et ffserver
Je suis un peu en retard, Mais mon puissant
VidGear
Bibliothèque Python automatise le processus de traitement en pipeline OpenCV des images dans les Formats sur n'importe quelle plateforme. Voici une base de python exemple:Source: https://github.com/abhiTronix/vidgear/wiki/Compression-Mode:-FFmpeg#2-writegear-apicompression-mode-with-opencv-directly
Vous pouvez consulter VidGear Docs pour des applications plus avancées et des fonctions.
Espère que ça aide!
M'a fallu une heure pour comprendre que c'est par défaut, windows les tuyaux ne sont pas binaires. Cela provoque des octets (plus précisément les retours à la ligne) pour être modifiée ou omis, et la vidéo est à changer lentement parce que la taille de l'image n'est pas constante.
À ce travail autour de, la modification de fichier python:
Pour tester si la tuyauterie de la vidéo brute est réussi, utilisez ffplay. Assurez-vous de spécifier un framerate plus élevé que ce qui est à venir à partir de la pipe, sinon la vidéo commence à accuser
Ne sais pas si c'est compatible Mac OS, ou python3-spécifique, mais j'avais besoin de jeter le cadre d'une chaîne de caractères dans l'ordre pour que cela fonctionne pour moi, comme suit: