pts и вычисление времени видео

94
28 декабря 2020, 22:30

1. Пытаюсь вычислить текущее время видео и получаю ошибку: pts не является членом "AVStream"

while ((video_st && !video_is_eof) || (audio_st && !audio_is_eof)) {
        /* Вычисление текущего аудио и видео времени */
        audio_time = (audio_st && !audio_is_eof) ? audio_st->pts.val * av_q2d(audio_st->time_base) : INFINITY;
        video_time = (video_st && !video_is_eof) ? video_st->pts.val * av_q2d(video_st->time_base) : INFINITY;

        if (!flush &&
            (!audio_st || audio_time >= STREAM_DURATION) &&
            (!video_st || video_time >= STREAM_DURATION)) {
            flush = 1;
        }
        /* write interleaved audio and video frames */
        if (audio_st && !audio_is_eof && audio_time <= video_time) {
            write_audio_frame(oc, audio_st, flush);
        }
        else if (video_st && !video_is_eof && video_time < audio_time) {
            write_video_frame(oc, video_st, flush);
        }
    }

2. Как ffmpeg хранит необработанные кадры видео? Думала, что для этого используется AVFMT_RAWPICTURE, но насколько поняла - это устарело.

Буду рада любой помощи.

Answer 1
  1. У AVStream нет поля pts. Это поле есть у типов AVPacket и AVFrame (по умолчанию берущееся из AVPacket при декодировании, но потом вы можете установить свое, если вам так будет нужно). У AVStream есть поле start_time, которое указывает на время начала записи (или стрима). Во всех случаях время указано в AVStream::time_base единицах

  2. Необработанные это какие? Если закодированные то в AVPacket::data (AVPacket::buf). Если декодированные, то в AVFrame::data и AVFrame::extended_data

Answer 2

Текущее время можно найти в AVPacket::pts и AVFrame::pts. Недекодированные данные для кодека по идее в AVPacket::data.

READ ALSO
*.VC.db в проекте Visual Studio

*.VC.db в проекте Visual Studio

В проекте есть *VC

139
Можно ли сократить этот код?

Можно ли сократить этот код?

Могу ли я как то сократить этот код не теряя его функциональности?

130