Suche ein AVFrame
in ein Array zu kopieren, in dem Pixel einen Kanal zu einer Zeit in einer Zeilenhauptordnung gespeichert ist.FFMPEG - AVFrame zu pro-Kanal-Array Umwandlung
Details:
ich FFmpegs api bin mit Frames aus einem Video zu lesen. Ich habe avcodec_decode_video2
verwendet, um jeden Rahmen als AVFrame
zu holen, wie folgt:
AVFormatContext* fmt_ctx = NULL;
avformat_open_input(&fmt_ctx, filepath, NULL, NULL);
...
int video_stream_idx; // stores the stream index for the video
...
AVFrame* vid_frame = NULL;
vid_frame = av_frame_alloc();
AVPacket vid_pckt;
int frame_finish;
...
while (av_read_frame(fmt_ctx, &vid_pckt) >= 0) {
if (b_vid_pckt.stream_index == video_stream_idx) {
avcodec_decode_video2(cdc_ctx, vid_frame, &frame_finish, &vid_pckt);
if (frame_finish) {
/* perform conversion */
}
}
}
Ziel-Array wie folgt aussieht:
unsigned char* frame_arr = new unsigned char [cdc_ctx->width * cdc_ctx->height * 3];
Ich brauche all vid_frame
in frame_arr
zu kopieren, wobei der Bereich von Pixeln Werte sollten [0, 255] sein. Das Problem besteht darin, dass das Array den Frame in der Reihenfolge der Zeilen speichern muss, und zwar jeweils ein Kanal, dh R11, R12, ... R21, R22, ... G11, G12, ... G21, G22, .. . B11, B12, ... B21, B22, ... (I die Bezeichnung [color channel] [Zeilenindex] [Spaltenindex] verwendet, dh G21 Grünkanalwert des Pixels in Zeile 2, Spalte 1) . Ich habe mir sws_scale
angesehen, aber ich verstehe es nicht genug, um herauszufinden, ob diese Funktion in der Lage ist, eine solche Umwandlung durchzuführen. Kann jemand helfen !! :)
Danke @halelfelf. Ich habe einige Tests gemacht und es scheint, dass die Verwendung von sws_scale für die Konvertierung in GBR ziemlich langsam ist, verglichen mit dem Kopieren von Pixel für Pixel. Ich melde mich zurück! – ahmadh