Изменения частоты кадров в видео, без перекодирования

У меня есть видео mkv (h264), которое составляет 23.976 fps (24000/1001), но я хочу преобразовать его в 25 кадров в секунду без повторного кодирования и потери качества.
Я знаю, что mkvmerge может это сделать ( с опцией --default-duration '0:25fps'), но я хотел бы сделать это непосредственно из ffmpeg, если это возможно
По документам это должно работать:

ffmpeg -i input.mkv -r 25 -vcodec copy output.mkv

но когда я выполняю его, я получаю только тот же кадр видео.
Каков правильный метод сделать это (если существует) в ffmpeg?

12
задан phate89
05.05.2023 23:51 Количество просмотров материала 2459
Распечатать страницу

1 ответ

вот метод, использующий текущие версии FFmpeg. Он полагается на демультиплексор concat, не масштабирующий PTS входных данных после первого файла, а просто применяющий фиксированное смещение. Допустим, у вас есть 30 трансляция FPS с графика 15360 (типичный для выхода FFmpeg). Это означает, что рама 0 имеет PTS 0 и рамой 30 имеет PTS 15360. Это стало бы 45 фпс потока, если мы могли бы изменить сроки 23040 без изменения значений PTS.

по существу, это то, что делает метод ниже.

1. Определите свойства источника.

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s,
       30 fps, 30 tbr, 15360 tbn (default)

вы хотите отметить свойства источника, особенно разрешение и tbn.


2a. (Необязательно) измените шкалу времени на что-то удобное, чтобы упростить вычисления.

ffmpeg -i in.mp4 -c copy -an -video_track_timescale 30 in-v30.mp4

это

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s, \
       30 fps, 30 tbr, 30 tbn (default

если вы сделаете этот шаг, новый сроки должна быть равной или кратной исходной частоты кадров.

2b. Рассчитайте необходимую временную шкалу, чтобы для целевой частоты кадров x, PTS кадра # x в исходном коде должно иметь то же значение, что и новый tbn. Если вы выполнили шаг 2a, это очень легко, и это просто новая частота кадров. Итак, для целевого fps 45, new tbn должно быть 45.


3. Создать пустышку видео.

ffmpeg -f lavfi -i color=s=1280x720:r=45:d=1 -profile:v main -video_track_timescale 45 0.mp4

все свойства должны быть такими же, как разрешение, профиль H. 264, формат пиксела, ссылки счетчик..etc для самых лучших результатов.


4 Конкат видео.

сначала создайте текстовый файл

file '0.mp4'
file 'in-v30.mp4'

затем функция concat

ffmpeg -f concat -i list.txt -c copy -video_track_timescale 45 45fps.mp4

выходной файл будет иметь 2-е воспроизведение видео на 45 кадров в секунду.

5. Теперь, Отцепись от манекена preroll

ffmpeg -ss 1.1 -i 45fps.mp4 -c copy -avoid_negative_ts make_zero in45.mp4

и

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1757 kb/s, \
       45 fps, 45 tbr, 11520 tbn (default)

я сказал, что это было запутанным!

8
отвечен Gyan 2023-05-07 07:39

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх