Как изменить частоту кадров декодирования libav?

#c #decoding #frame-rate #libav

#c #декодирование #частота кадров #libav

Вопрос:

Есть ли какой-либо способ изменить частоту кадров декодирования libav? В структурах libav есть несколько переменных, ответственных за получение частоты кадров, но, насколько я знаю, все они предназначены только для чтения (в режиме декодирования). Среди них:

 AVStream.duration
AVStream.nb_frames
AVStream.r_frame_rate
AVStream.time_base
  

Первые два сообщают мне количество кадров, а последние два сообщают мне частоту кадров. Но, похоже, я не могу просто установить их, иначе это, вероятно, не вызовет должного эффекта.

Есть предложения?

Ответ №1:

Если я правильно понимаю, вам нужно декодированное видео с более низкой частотой кадров, чем оно было закодировано. Лучшим решением было бы пропустить пакеты кадров перед их декодированием с необходимой вам скоростью (перед вызовом avcodec_decode_video2()). Никогда не пробовал, но это должно сработать. Это сэкономит ненужный процессор, потраченный на декодирование ненужных кадров.

Комментарии:

1. Мне нужно иметь возможность не только уменьшать, но и увеличивать частоту кадров. Более того, многие кодеки используют усеченный флаг, поэтому кадры могут быть сдвинуты в пакетах — не факт, что один пакет будет содержать один кадр. Таким образом, пропуск пакетов, очевидно, может и наверняка вызовет проблемы. Кроме того, видеопоток может содержать некоторые информационные пакеты (обычно в начале потока), несмотря на наличие отдельных потоков данных. Так что это не лучшая идея, если вы хотите написать код для поддержки нескольких форматов.