Как воспроизвести AVI файл в цикле - PullRequest
0 голосов
/ 10 октября 2019

Я использую ffMpeg для воспроизведения AVI-файла.

Это мой код, в котором я читаю кадр ..

Я определяю свою структуру

typedef struct {

    AVFormatContext *fmt_ctx;
    int stream_idx;
    AVStream *video_stream;
    AVCodecContext *codec_ctx;
    AVCodec *decoder;
    AVPacket *packet;
    AVFrame *av_frame;
    AVFrame *gl_frame;
    struct SwsContext *conv_ctx;
    GLuint frame_tex;
}AppData;

ЭтоВот как я читаю кадр.

bool readFrame(AppData *data)
{
    do {
        if (av_read_frame(data->fmt_ctx, data->packet) < 0) {
            av_free_packet(data->packet);
            return false;
        }

        if (data->packet->stream_index == data->stream_idx)
        {
            int frame_finished = 0;

            if (avcodec_decode_video2(data->codec_ctx, data->av_frame, &frame_finished,
                data->packet) < 0) {
                av_free_packet(data->packet);
                return false;
            }

            if (frame_finished)
            {
                if (!data->conv_ctx)
                {
                    data->conv_ctx = sws_getContext(data->codec_ctx->width,
                        data->codec_ctx->height, data->codec_ctx->pix_fmt,
                        data->codec_ctx->width, data->codec_ctx->height, AV_PIX_FMT_RGBA,
                        SWS_BICUBIC, NULL, NULL, NULL);
                }

                sws_scale(data->conv_ctx, data->av_frame->data, data->av_frame->linesize, 0,
                    data->codec_ctx->height, data->gl_frame->data, data->gl_frame->linesize);

                glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, data->codec_ctx->width,
                    data->codec_ctx->height, GL_RGBA, GL_UNSIGNED_BYTE,
                    data->gl_frame->data[0]);

            }

        }
        av_free_packet(data->packet);

    } while (data->packet->stream_index != data->stream_idx);

    return true;

} 
  1. В настоящее время видео воспроизводится и останавливается на последнем кадре, как я могу сбросить номер кадра, чтобы начать кадр после воспроизведения всего видео.
  2. Как я могу воспроизвести видео, передав номер кадра вместо автоматической петли?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...