Змініть частоту кадрів відео MP4 за допомогою ffmpeg


8

У мене є відео у форматі mp4 з частотою кадрів .33(1 кадр протягом 3 секунд). Я хочу збільшити частоту кадрів до 5 кадрів / сек. Я спробував команду нижче, але вона нічого не робить:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

Будь-яка ідея, чому ffmpeg ігнорує -rваріант?


Якщо ви намагаєтеся прискорити / уповільнити відео, а НЕ дублювати кадрів / виводу, см superuser.com/questions/854753 / ... і / або askubuntu.com/questions/370692 / ...
Пітер Кордес

Відповіді:


7

Я знаю, що це старе питання, але жоден із нинішніх відповідей уже не є рекомендованим способом.

Перейгравання без втрат (відео)

Як зазначається в коментарях, є спосіб зробити це, коли відео не потрібно перекодувати. Це вимагає перемогування файлу в інший формат MKV, а потім його повторне відтворення в MP4. Ось приклад, який змінює відео на 12 кадрів / секунду:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

Якщо відео містить аудіо, ви також можете уповільнити це, не змінюючи висоту, але це не конверсія без втрат. Наведений нижче приклад передбачає, що вихідне відео було 24 кадрів / секунду, так що звук потрібно було уповільнити до половини (0,5) швидкості за допомогою atempo- фільтра ffmpeg .

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

FFMPEG Wiki Guidance

Це вказівки з вікі ffmpeg . Зауважте, що всі ці параметри вимагають перекодування відео.

Прискорення / уповільнення відео

Ви можете змінити швидкість відеопотоку, використовуючи встановлений відеофільтр. Зауважте, що в наступних прикладах аудіопотік не змінюється, тому в ідеалі його слід відключити за допомогою -an.

Щоб подвоїти швидкість відео, ви можете використовувати:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

Фільтр працює, змінюючи часову позначку презентації (PTS) кожного відеокадру. Наприклад, якщо є два послідовних кадри, показані на часових позначках 1 і 2, і ви хочете пришвидшити відео, ці часові мітки повинні стати відповідно 0,5 і 1. Таким чином, ми повинні помножити їх на 0,5.

Зауважте, що цей метод скидає кадри для досягнення бажаної швидкості. Ви можете уникнути скинутих кадрів, вказавши більш високу швидкість кадру, ніж вхідну. Наприклад, щоб перейти від входу 4 FPS до такого, який скорочується до 4x, що (16 FPS):

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

Щоб уповільнити своє відео, вам потрібно використовувати множник, більший за 1:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

Гладкий

Ви можете згладити повільне / швидке відео за допомогою відеофільтра Мінтерполята. Це також відоме як "інтерполяція руху" або "оптичний потік".

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

Інші варіанти включають slowmoVideo та Butterflow. Прискорення / уповільнення звуку

Ви можете прискорити або уповільнити звук за допомогою аудіо-фільтра atempo. Щоб подвоїти швидкість звуку:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

Фільтр atempo обмежений використанням значень від 0,5 до 2,0 (тому він може уповільнити його не менше ніж до половини початкової швидкості та швидкості до не більше ніж удвічі більше вхідного). Якщо вам потрібно, ви можете обійти це обмеження, з'єднавши кілька фільтрів atempo разом. Наступне, у чотири рази швидкість звуку:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

Використовуючи складний фільтр, ви можете одночасно прискорити відео та аудіо:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

1
Швидкість / уповільнення можна просто перемотати, але FFmpeg не знає, як це зробити . наприклад, для mkv, mkvtoolnix може це зробити. Наприклад, mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv змініть частоту кадрів на контейнері MKV . Ви можете перетворити файл на MKV і повернутися до MP4 або знайти інструмент, який робить це безпосередньо для MP4. xcoding відео дуже інтенсивним процесором та втратою, тому це жахливий варіант.
Пітер Кордес

Повністю погодились, що переймовування на нижчий кадр є кращим, оскільки це підхід без втрат, який значно менше ресурсів. На практиці я не знайшов хорошого інструментарію для цього з MP4. Я не намагався насправді недавно, але ще коли я вперше написав цю відповідь, я робив перетворення MP4-> MKV-> MP4, і я не міг змусити його працювати за допомогою mkvtoolnix, ffmpeg та / або mp4box. Мені доведеться спробувати запропоновані вами параметри.
pseudosavant

6

Якщо вхідний файл не має дійсної частоти кадрів, вам, можливо, доведеться встановити його чітко

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4

Це перекодує, коли вам справді потрібно лише ремуксувати. (Якщо ви насправді не хочете копіювати / відкидати кадри, а не гальмувати / прискорювати відео.)
Пітер Кордес,

3

Я міг отримати змінену частоту кадрів, що набрала чинності, лише якщо вхідний файл був класифікований як "необроблений" файл:

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

Без вказівки -f h264він за замовчуванням до 25 кадрів в секунду, і його неможливо змінити. Мабуть, це було тому, що потоку взагалі бракувало будь-якої інформації про частоту кадрів, і це кадр за замовчуванням ffmpeg.

Мабуть, коли ви використовуєте -rяк вихідний варіант, він дублює або скидає кадри, тому відео відтворюється з однаковою швидкістю - в цьому випадку не те, що ви хочете! Але зміна вхідної частоти кадрів, як зазначено вище, призведе до прискорення або уповільнення відео, не втрачаючи або дублюючи кадри.


1
Моя корисна відповідь. Тут немає повторного кодування
йота

1

Така особливість - зміна частоти кадрів - називається "узгодженою" і часто використовується для отримання повільного руху або швидкого руху вперед, як показника росту рослини в лічені хвилини. ffmpeg не дозволяють перезаписати / змінити частоту кадрів без повторного кодування . Якщо це зробити так, тривалість зміниться, і звук не синхронізується, якщо окремо не поправлено. Але я боюся, що аудіо не цікавить ваш випадок із частотою кадрів у розмірі .33

Ви хочете відповідати, тому що ви просто хочете змінити частоту кадрів, але ffmpeg -rмовчки ігноруєякщо частота кадрів вказана у вхідному файлі. Оскільки ваш вхідний файл у форматі .mp4, його власний кадр має перевагу-rколи повторне кодування не потрібно. Для цього вам потрібен інший інструмент: mencoder.

Якщо припустимо, що вхідний файл не містить звуку - можливо, це стосується будь-якого відео з кадром .33, - що вам потрібно:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

Зауважте, що mencoder за замовчуванням виробляє вихід у форматі AVI.


1
Це неправильно. Якщо rвказаний вихідний комутатор, ffmpeg видасть вихід у зазначеному кадрі, незалежно від частоти кадрів входу. Якщо rвказано як вхідний перемикач, ffmpeg буде дублювати або відкидати кадри за необхідності, щоб подати вказану кількість кадрів в секунду входу у фільтр / кодер.
Gyan

Поведінка, яку ви описуєте, коли rвхідний перемикач суперечить моєму попередньому експерименту над форматом .mp4, приміткою Malvineous (на цій сторінці) та описом помилки 403 trac.ffmpeg.org/ticket/403 ; ваш опис при rвикористанні на виході трапляється при повторному кодуванні, тоді як сценарій ОП здається відповідним випадком (виправити кадр без повторного кодування) тим фактом, що він мав .33 кадрів.
Танкман 六四

1
Перевірте вкладений тут звіт . Зверніть увагу на командний рядок вгорі, вхідні та вихідні метадані та, нарешті, немає. кадрів, закодованих.
Gyan

1
Погодився, що ОП хоче просто відповідати файлу, але їх задана команда перекодує, оскільки перемикачі копій не вказані. У такому сценарії ffmpeg повинен генерувати новий потік на rfps.
Gyan

Дякую, Mulvya за переконливий вибірки. Так, ви праві на використання -r. Це використання не могло вплинути на мої попередні експерименти у відповідь на ОП, оскільки, думаючи про відповідний випадок, я ніколи не скидав параметр копіювання з ffmpeg, і -rтаким чином ігнорується. Я написав запит на особливості: trac.ffmpeg.org/ticket/5170
Tankman 六四

0

Найшвидший спосіб - створити BAT-файл у каталозі з такими рядками:

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

Вам потрібно мати mkvmerge та ffmpeg в одному каталозі. Він змінює кожен mp4-файл за секунди автоматично, без втрати якості.

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