2016-07-20 3 views
1

Objectif


J'écris une petite application preuve de concept pour prendre des données d'image brutes j'acquiers d'un numérique caméra (une série d'images RGB24), et les combiner ensemble dans un fichier vidéo simple, sans audio.FFMPEG - Impossible de créer une vidéo de la série d'images au format de pixel RGB24


travail So Far

Le code d'initialisation est la suivante:


AVCodec* pCodec = NULL; 
AVCodecContext* pCodecContext = NULL; 
AVFrame* pFrame = NULL; 

/* Register all available codecs. */ 
avcodec_register_all(); 

/* Determine if desired video encoder is installed. */ 
pCodec = avcodec_find_encoder(CODEC_ID_MJPEG); 
if (!pCodec) { 
    printf("Codec not installed!\n"); 
} 

pCodecContext = avcodec_alloc_context3(pCodec); 
pFrame = avcodec_alloc_frame(); 

Très coupé et sec. Cependant, lorsque je tente d'enregistrer le codec, il échoue avec mon message d'erreur personnalisé, et un est tombé dans un joli format codé couleur directement à partir des bibliothèques de FFMPEG:


[mjpeg @ 0x650d00] Specified pixel format rgb24 is invalid or not supported 
Codec not available. 

Je peux confirmer que ce format de pixel est valide assez facilement:


Pixel formats: 
I.... = Supported Input format for conversion 
.O... = Supported Output format for conversion 
..H.. = Hardware accelerated format 
...P. = Paletted format 
....B = Bitstream format 

2>&1 ffmpeg -pix_fmts | grep -i -e rgb24 -e flags 
FLAGS NAME   NB_COMPONENTS BITS_PER_PIXEL 
IO... rgb24     3   24 

Je peux également confirmer que le codec vidéo que j'essaie d'utiliser est valide pour l'encodage.


Codecs: 
D..... = Decoding supported 
.E.... = Encoding supported 
..V... = Video codec 
..A... = Audio codec 
..S... = Subtitle codec 
...I.. = Intra frame-only codec 
....L. = Lossy compression 
.....S = Lossless compression 

2>&1 ffmpeg -codecs | grep -i mjpeg    
DEVIL. mjpeg    Motion JPEG 

Question


Pourquoi ce format de pixel non pris en charge? Cela semble très commun lorsque vous travaillez avec d'autres utilitaires tels que MATLAB, OpenCV, FreeImage, etc. Existe-t-il un ensemble d'options ou de fonctions dans FFMPEG/AVcodec pouvant résoudre ce problème? Je souhaite éviter d'avoir à convertir manuellement mon image en un espace de couleur différent si possible, donc je ne brûle pas les cycles CPU en convertissant d'abord l'image RGB24 en un nouveau format, THEN en encodant une image vidéo avec il.

Merci.

Répondre

1

Si vous exécutez ffmpeg -h encoder=mjpeg, vous verrez

... 
Encoder mjpeg [MJPEG (Motion JPEG)]: 
    General capabilities: threads 
    Threading capabilities: frame and slice 
    Supported pixel formats: yuvj420p yuvj422p yuvj444p 

fonctionnent avec des pixels des images JPEG encodées comme YUV. qtrle, png ou libx264rgb, entre autres, acceptera RVB, mais devrait être enregistré comme .mov - Quicktime.

+0

Il semble que j'ai mal compris les "formats pris en charge" à partir de la ligne de commande. Je vais reconvertir (avec une étape supplémentaire) en un format supporté. Merci! – DevNull