2016-07-20 31 views
1

Tor


schafft Ich bin eine kleine Proof-of-Concept-Anwendung zu schreiben einige Rohbilddaten nehmen ich von einem digitalen erwerben Kamera (eine Reihe von RGB24-Bildern), und kombinieren Sie sie zu einer einfachen, keine Audio-Video-Datei.FFMPEG - Es kann kein Video aus der Serie von Bildern mit RGB24 Pixelformat


Arbeit So Far

Der Initialisierungscode ist wie folgt:


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(); 

Sehr cut-and-dry. Aber wenn ich versuche, den Codec zu registrieren, schlägt es mit meiner benutzerdefinierten Fehlermeldung und ein fiel in einem schönen farbcodierten Format direkt von den FFmpeg-Bibliotheken:


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

Ich kann bestätigen, dass das Pixelformat gültig ist leicht genug:


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 

Ich kann auch bestätigen, dass der Video-Codec, den ich verwenden möchte, für die Codierung gültig ist.


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 

Frage


Warum ist das Pixelformat nicht unterstützt? Es scheint so ein gewöhnlicher Vorgang zu sein, wenn man mit anderen Utilities wie MATLAB, OpenCV, FreeImage usw. arbeitet. Gibt es irgendwelche Optionen oder Funktionen in FFMPEG/AVcodec, die dieses Problem lösen können? Ich möchte vermeiden, dass ich mein Bild nach Möglichkeit manuell in einen anderen Farbraum umwandeln muss. Ich verbrenne also keine CPU-Zyklen, indem ich das RGB24-Bild zuerst in ein neues Format umwandle es.

Vielen Dank.

Antwort

1

Wenn Sie ffmpeg -h encoder=mjpeg ausführen, werden Sie sehen

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

JPEGs mit Pixeln arbeiten, wie YUV codiert. qtrle, png oder libx264rgb wird unter anderem RGB akzeptieren, sollte aber als .mov - Quicktime gespeichert werden.

+0

Scheint, ich habe die "unterstützten Formate" von der Kommandozeile missverstanden. Ich konvertiere (mit einem zusätzlichen Schritt) in ein unterstütztes Format. Vielen Dank! – DevNull