int64_t timeBase;
timeBase = (int64_t(pavStrm-> time_base.num) * AV_TIME_BASE) / int64_t(pavStrm->time_base.den);
int64_t seekTarget = int64_t(iFrameNumber) * timeBase;
av_seek_frame(fmt_ctx, -1, seekTarget, AVSEEK_FLAG_FRAME);
ここでは、iFrameNumebr の後の次の 5 フレームを読み取りたい
for(int iCnt = 0; iCnt <= 4; iCnt++)
{
iRet = av_read_frame(fmt_ctx, &pkt);
do
{
ret = decode_packet(&got_frame, 0);
if (ret < 0)
break;
pkt.data += ret;
pkt.size -= ret;
}while (pkt.size > 0);
av_free_packet(&pkt);
}
static int decode_packet(int *got_frame, int cached)
{
int ret = 0;
int decoded = pkt.size;
*got_frame = 0;
if (pkt.stream_index == video_stream_idx)
{
/* decode video frame */
ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
}
AVSEEK_FLAG_BACKWARD を使用している場合、5 パケットと 5 フレームの最初の 2 つは空白ですが正しいです。
AVSEEK_FLAG_FRAME を使用している場合、最初の 3 フレームではない 5 パケットと 3 フレームがビデオから返されます。
任意の iFrameNumber
フレーム番号を取得しながらフレームを取得する方法と、av_seek_frame() の seektarget 3 番目のパラメータの正確な値を教えてください。
フレームをrgb24形式に変換する際にも問題があります