AVFrame
ピクセルが一度に 1 つのチャネルを行優先の順序で格納される配列にコピーしようとしています。
詳細:
ビデオからフレームを読み取るために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] である必要があります。問題は、配列がフレームを一度に 1 つのチャネル、つまり R11、R12、... R21、R22、... G11、G12、... G21、G22、などの行優先順で格納する必要があることです。 . B11, B12, ... B21, B22, ... ([カラー チャネル][行インデックス][列インデックス] という表記を使用しました。つまり、G21 は行 2、列 1 のピクセルの緑チャネル値です) . 私は を見てきましたが、sws_scale
その関数がそのような変換を行うことができるかどうかを理解するのに十分ではありません. 誰か助けてくれませんか!! :)