픽셀을 행 하나씩 순서대로 한 채널 씩 저장하는 배열로 AVFrame
을 복사하려고합니다.FFMPEG - AVFrame 대 채널당 배열 변환
상세 사항 :
나는 비디오에서 프레임을 읽어 FFMPEG의 API를 사용하고 있습니다. I는 frame_arr
화소의 범위에 vid_frame
모두 복사해야
unsigned char* frame_arr = new unsigned char [cdc_ctx->width * cdc_ctx->height * 3];
:
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 */
}
}
}
대상 배열이 다음과 같다 : 다음과 같이 I는 AVFrame
각 프레임을 가져 avcodec_decode_video2
을 사용한 값은 [0, 255]이어야합니다. 문제는 배열이 한 번에 한 채널, 즉 R11, R12, ... R21, R22, ... G11, G12, ... G21, G22, .. 같은 행 주요 순서로 프레임을 저장해야한다는 것입니다. B11, B12, ... B21, B22, ... (표색 [색상 색인] [열 색인] [열 색인]을 사용했습니다. 즉, G21은 2 행 1 열의 픽셀의 녹색 채널 값입니다) . 나는 sws_scale
을 보았지만 그 기능이 그러한 변환을 할 수 있는지 여부를 이해할만큼 충분히 이해하지 못합니다. 누군가 도와 줄 수 있어요 !! :)
감사합니다. @halfelf. 몇 가지 초기 테스트를했는데 sws_scale을 GBR로 변환하는 것이 픽셀 단위로 복사하는 것과 비교하면 상당히 느린 것 같습니다. 나는 다시보고 할 것이다! – ahmadh