Зміна частоти кадрів у ffmpeg без перекодування


14

У мене є mkv (h264) відео з 23,976 кадрів в секунду (24000/1001), але я хочу перетворити його на 25 кадрів в секунду без перекодування та втрати якості. Я знаю, що mkvmerge може це зробити (з опцією --default-length '0: 25fps'), але я хотів би зробити це безпосередньо з ffmpeg, якщо можливо. Відповідно до документів це має працювати:

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

але коли я його виконую, я отримую лише той самий відеоролик в секунду. Який правильний метод зробити це (якщо він існує) у ffmpeg?


1
Я вважаю, що наразі це неможливо з FFmpeg. -rне сумісний з потоковою копією, і немає біткойн-фільтрів для зміни частоти кадрів.
Елі

1
занадто погано. Мені доведеться використовувати mkvmerge кожен раз. дякую
phate89

1
Існує спрощений спосіб зробити це за допомогою регулярного ffmpeg, і прямий спосіб зробити це зі старою модифікованою версією ffmpeg. Якщо вам цікаво, я напишу це як відповідь.
Gyan

1
Так, дякую .. Я хотів би це зробити без додаткових інструментів (мені вже потрібен ffmpeg)
phate89

1
@Mulvya ти говориш про це так? Я вагався, як це пов’язати, але це вже давно. Зацікавився переплутаним способом зробити це звичайним FFmpeg, хоча.
Елі

Відповіді:


15

Ось метод з використанням поточних версій FFmpeg. Він спирається на concat demuxer не змінюючи масштаб PTS входів після першого файлу, а просто застосовуючи фіксований зміщення. Скажімо, у вас потік 30 кадрів в секунду з часовим шкалом 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.


. (Необов’язково) Змініть масштаб часу на щось зручне, щоб зробити обчислення простішими.

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

Якщо ви зробите цей крок, новий часовий діапазон повинен бути рівним або невід'ємним кратним початкового частоти кадрів.

. Обчисліть необхідний часовий масштаб, так що для цільової частоти кадрів xPTS кадру № xу джерелі повинен мати те саме значення, що і новий tbn. Якщо ви здійснили крок 2а, це дуже легко, і це просто новий кадр. Отже, для цільових кадрів в секунду має бути 45нове .tbn45


3 . Створення фіктивного відео.

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

Усі властивості повинні бути такими ж, як роздільна здатність, профіль H.264, формат пікселів, кількість посилань і т.д. для найкращих результатів.


4 Підведіть відео.

Спочатку зробіть текстовий файл

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

Потім, конмат

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

Вихідний файл матиме 2-е відео, яке відтворюється зі швидкістю 45 кадрів в секунду.

5 . Тепер відколюйте манекенний преролл

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)

Я сказав, що це суперечка!


1
дуже розумна, хороша відповідь.
Rowe Morehouse
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.