Запись видео с неизвестной частотой кадров с помощью FFmpeg

Я записываю видео с помощью FFmpeg, и мне бы хотелось, чтобы частота кадров, с которой оно записано, была хотя бы на правильном уровне. Прямо сейчас я беру частоту кадров, на которую претендует мой ввод, и использую ее для установки частоты кадров (time_base) для моего выходного видеопотока. Однако иногда это сильно отличается от фактической частоты кадров, которую я получаю (я видел поток, заявляющий 50 кадров в секунду, но публикующий 9 кадров в секунду).

Что я хотел бы сделать, так это использовать истекший таймер и подсчитать кадры, которые я записываю, чтобы рассчитать фактическую частоту кадров, с которой я записал, когда я закончил запись. Хотя мне кажется, что частота кадров, установленная в моем AVStream, используется в avcodec_open2 до того, как я запишу какие-либо кадры. Если я установлю его позже (например, во время записи кадров), пока ffplay может его воспроизвести (жалуясь, что биты приращения времени равны 6, а не 4), другие видеоплееры не могут. Есть ли способ установить частоту кадров для всего файла после записи кадров? Если нет, есть ли способ указать самим кадрам какую-то временную метку или частоту кадров во время записи, что приведет к правильному записанному файлу?


person Chris    schedule 13.04.2016    source источник
comment
привет, я посмотрю еще, но просто хотел спросить об avconv. нашел его после быстрого поиска в Google, похоже, он может изменить частоту кадров файла. возможно, вы могли бы записать файл с произвольной частотой кадров, а затем, после определения реальной частоты, закончить запись и запустить avconv с новой частотой? просто мысль, а не реальный ответ ;) хотя буду продолжать искать. дай мне знать.   -  person cure    schedule 03.11.2016
comment
avconv — это двоичное имя проекта libav. (superuser.com/questions/507386/) имеет довольно приличную сводку всех имен, которые меня смущали в течение некоторого времени. Все, что делает avconv, должно быть возможно с библиотеками, которые он использует.   -  person Chris    schedule 03.11.2016
comment
вы смогли решить задачу? У меня тоже такая же проблема(   -  person Irina    schedule 15.07.2021
comment
@Ирина Смотрите мой ответ ниже. По сути, вы устанавливаете временную базу на степень детализации вашего таймера, а затем каждый кадр устанавливает PTS на прошедшее время.   -  person Chris    schedule 28.07.2021


Ответы (2)


Хитрость заключается в использовании AVCodecContext time_base и точки AVFrame более разумно, чем я. Если вы записываете с фиксированной частотой кадров, то time_base устанавливается равным 1/частоте кадров, а pts — это просто увеличенное число для записанного кадра.

Вместо этого теперь я запускаю истекший таймер, когда начинаю запись, и устанавливаю для time_base значение 1 поверх детализации таймера (в моем случае он имеет точность в миллисекундах, поэтому 1000). Я устанавливаю pts кадра на количество прошедшего времени до его кодирования. Эта комбинация приводит к правильному воспроизведению видеофайла с переменной частотой кадров.

person Chris    schedule 24.07.2017

Крис. Вам необходимо разработать новый механизм записи видеопотока. Поэтому, если вы установите частоту кадров как [N], механизм записи будет записывать кадры в соответствии с частотой.

  • Проверка метки времени для каждого кадра при записи
  • Если у вас меньше кадров, чем N в секунду, вам нужно сделать дубликаты кадров.
  • Если у вас есть больше кадров, чем N в секунду, вам нужно отбросить некоторые кадры.

Перед записью нужно указать точную частоту кадров.

И ваш движок записи видеофайлов должен работать с указанной частотой кадров.

Вы можете реализовать это с помощью ffmpeg.

person Yuichi Akiyoshi    schedule 03.11.2016
comment
Кажется, это лучшее, что можно сделать с переменной частотой кадров, но что, если бы она была фиксированной и неизвестной? В случае, когда я представил поток, заявленный 50 кадров в секунду, но на самом деле 9, поэтому, хотя ваш подход сработает, я буду записывать в 5 раз больше кадров, чем мне нужно. По сути, для того, чтобы это работало хорошо, вам все еще нужно знать частоту кадров, прежде чем начать. - person Chris; 03.11.2016