ピクセルは行優先順位で一度に1チャンネルずつ格納される配列にAVFrame
をコピーすることを検討しています。FFMPEG - チャンネルごとのアレイ変換へのAVFrame
詳細:
私はビデオからフレームを読み取るためにFFMPEGのAPIを使用しています。私は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 */
}
}
}
宛先アレイは次のようになります。次のように私はAVFrame
ように、各フレームを取得するためにavcodec_decode_video2
を使用しています値は[0、255]でなければなりません。問題は、アレイが一度に1つのチャネル、つまりR11、R12、... R21、R22、... G11、G12、...、G21、G22、...の順番で行を格納する必要があることです。 B11、B12、... B21、B22、...(私は表記[カラーチャンネル] [行インデックス] [列インデックス]を使用しました。つまりG21は行2の1列目のピクセルの緑色チャンネル値です) 。私はsws_scale
を見ましたが、その機能がそのような変換を行うことができるかどうかを知るには十分理解できません。誰かが助けることができます! :)
ありがとう@halfelf。私はいくつかの初期テストを行い、sws_scaleを使ってGBRに変換するのは、単にピクセル単位でピクセルをコピーするのと比べてかなり遅いようです。私は戻って報告する! – ahmadh