我希望将一个复制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,.. . B11, B12, ... B21, B22, ... (我使用了符号[颜色通道][行索引][列索引],即G21是第2行第1列像素的绿色通道值) . 我看过sws_scale
,但我对它的理解还不够,无法弄清楚该函数是否能够进行这样的转换。有人可以帮忙吗!!:)