我正在尋找將AVFrame
複製到一個數組中,其中像素以一個主要的順序一次存儲一個通道。FFMPEG - AVFrame到每個通道陣列的轉換
詳情:
我使用FFmpeg的API來讀取從視頻幀。我已經使用avcodec_decode_video2
每一幀取作爲AVFrame
如下:
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 */
}
}
}
目的地陣列看起來像這樣:
unsigned char* frame_arr = new unsigned char [cdc_ctx->width * cdc_ctx->height * 3];
我需要所有的vid_frame
複製到frame_arr
,像素的其中該範圍值應該是[0,255]。問題在於陣列需要按行的主要順序存儲幀,一次一個通道,即R11,R12,... R21,R22,... G11,G12,... G21,G22,...。 (我已經使用了符號[顏色通道] [行索引] [列索引],即G21是第2行第1列中的像素的綠色通道值)B11,B12,... B21,B22,... 。我曾看過sws_scale
,但我不明白這足以確定該功能是否有能力進行此類轉換。有人可以幫助! :)
謝謝@halfelf。我做了一些初始測試,看起來像使用sws_scale轉換爲GBR相當慢,而不是逐個像素地複製。我會報告回來! – ahmadh