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


14

Я намагаюся змінити частоту кадрів MP4-відео (це GoPro-відео зі швидкістю 120 кадрів в секунду, я хочу відтворити його в 30 кадрів в секунду для ефекту уповільнення).

Для цього я використовую avconv:

avconv -i SourceMovie.mp4 -vf setpts=4.0*PTS -r 30 DestMovie.mp4

Це технічно працює, але він перекодує фільм. Окрім того, що він повільний, це, очевидно, питання якості. Технічно повинен бути спосіб просто встановити кадр в секунду в заголовку відео, як я можу це змінити? (Будь-який інструмент, крім avconv, також працював би.)

Відповіді:


15

MP4Box може це зробити.

Команда

MP4Box -add SourceMovie.mp4#video -raw 1 -new test

створює файли testі test_track1.h264. Тепер ви можете створити файл mp4 з будь-яким підтримуваним кадром (30 у цьому прикладі):

MP4Box -add test_track1.h264:fps=30 -new DestMovie.mp4

MP4Box є частиною gpacпакету, тому переконайтеся, що він встановлений.


6
Це насправді не просто, але я це зрозумів - потрібно зробити це в два кроки. Спочатку витягніть відеопотік окремо як необроблений ( MP4Box -add source.mp4#video -raw 1 -new test), а потім збережіть його як MP4 знову ( MP4Box -add test_track1.h264:fps=30 -new dest.mp4). Ви також можете додати аудіозапис туди (через #audio).
EboMike

Краще використовувати -singleваріант для першої команди. MP4Box -single 1 -raw 1 SourceMovie.mp4створює лише один файл SourceMovie_track1.h264замість двох.
разногранок

6

Зміна частоти кадрів у заголовку відео (контейнера) не впливає на сам відеопотік (або аудіопотік). Повторне кодування - єдиний варіант.

Відеопотоки мають часові позначки і в більшості відеокліпи кадри взаємозалежні один одному через стиснення між кадрів. Деякі програвачі можуть пришвидшити та уповільнити відео, але не за допомогою вбудованих команд чи чогось іншого. Жоден гравець не може змінити частоту кадрів під час руху, коли контейнерна команда просить це зробити. Відеофайл закінчиться специфікацією (тобто не буде відповідати стандартам), і 99,9% гравців відмовляться його виконувати. Цілком неможливо робити те, що ви хочете, без перекодування. Звичайно, ви можете дочекатися перекодування до останнього кроку редагування.


1
Дякую Томе! Дурне питання, хоча - чому? Чи має кожен кадр часову позначку, яка змушує програвача забезпечити певну швидкість відтворення? Я хочу точно такі ж кадри, я просто хочу, щоб вони відтворювалися з різною швидкістю.
EboMike

2
Привіт Майку, жодне твоє питання не дурне, відверто кажучи, як ти вважаєш, досить розумне. мені подобається ваш спосіб мислення. Я додав більше інформації до своєї відповіді, тому що це було занадто довго, щоб помістити це в поле коментарів.
1313

Спасибі! Це досить інформативно. Що ж стосується перекодування - який найкращий спосіб зробити це з чимось на зразок avconv? Я використовував командний рядок вище, але це призвело до жахливої ​​якості - я майже міг побачити кожен макроблок.
EboMike

1
Мені здається, що часові позначки у відеопотоках зберігаються в контейнері, а не в сирому бітовому потоці h.264. Поки ви просто хочете змінити терміни, але не порядок, який кадр відображається, коли вам не потрібно буде перекодувати, просто ремуксуйте. (І якщо ви робите xcode, за допомогою більш швидкого обладнання ви використовуєте -встановити повільніше або veryslow, щоб отримати більш високу якість на бітрейті SAME, замість того, щоб просто кидати більше біт на проблему. І використовувати -crf 18 чи щось, а не ABR)
Пітер Кордес

1
Я не можу зрозуміти, як змусити ffmpeg вивести інший кадр. Схоже, mkvmerge / mp4box необхідні, якщо тільки ви не можете отримати ffmpeg для виведення сирої .264 бітового потоку, а потім скористатися опцією fps до деміксера h.264 (який -h повних документів у нього є, оскільки бітстрім не має часу інформація, просто замовляю.)
Пітер Кордес

3

Якщо ваша основна мета - відтворити його в повільному режимі, а не зберігати файл як MP4, ви можете використовувати інструмент графічного інтерфейсу MKVmerge, щоб перетворити його в контейнер Matroska, який може легко змінити частоту кадрів. Повторне кодування набагато краще, ніж перекодування, оскільки воно змінює лише метадані, а не сам потік.

Спочатку ви встановите пакет

sudo apt-get install mkvtoolnix-gui

Потім ви запускаєте графічний інтерфейс MKVmerge. Ви зіткнетесь із таким вікном

mkvmerge gui 1

Просто натисніть кнопку "Додати" та виберіть файл або навіть просто перетягніть файл у область "Введення файлів". У цей момент ви зможете вибрати відеопотік у своєму відео. Ви також можете видалити інші потоки, оскільки вони так чи інакше заважають.

Вибравши його, ви побачите активізацію нижньої вкладки:

введіть тут опис зображення

Змініть на "Форматування конкретних дій"

введіть тут опис зображення

Ви можете бачити, що є поле "FPS", куди можна вводити значення кадрів в секунду. Схоже, ви планували уповільнити справи чотири рази, тому приблизно 7 кадрів в секунду були б вашою метою. Ви також можете скористатися опцією "Розтягнути за".

Після цього ви можете просто змінити назву вихідного файлу (якщо ви хочете) і натиснути «Почати вимкнення».

Програма запуститься, і ви повинні мати свій файл.


2

Я також хотів сповільнити свої фільми з 120 FPS до 30 FPS. Я створив сценарій, який робить це, змінивши темп звуку і змінивши FPS безпосередньо в контейнері MP4. Необхідні наступні інструменти:

  1. avconv для перетворення аудіо потоків
  2. sndstretch, щоб уповільнити темп звуку
  3. gpac, щоб отримати MP4Box для зміни FPS

Сценарій, який використовується для перетворення, тут:

#!/bin/bash
#########################################
# Lossless slow down from 120 to 30 FPS #
#                                       #
# Use:                                  #
#                                       #
#   slow.bash <mp4_file>                #
#                                       #
#                           #-= OSi =-# #
#########################################


# Prepare basic variables
IN_FILE="$1"
NAME=$(echo "${IN_FILE}" | sed 's/\.[^.]*//')


# Clean up before start
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264" "${NAME}_slow.mp4"


# Slow down sound
avconv -i "${IN_FILE}" -vn -acodec pcm_s16le "${NAME}_.wav"
soundstretch "${NAME}_.wav" "${NAME}.wav" -tempo=-75
avconv -i "${NAME}.wav" -vn -codec:a ac3_fixed -b:a 448k "${NAME}.ac3"


# Change video frame rate and multiplex with slowed sound
MP4Box -add "${IN_FILE}#video" -raw 1 -new "${NAME}"
MP4Box -add "${NAME}_track1.h264:fps=30" -add "${NAME}.ac3" -new "${NAME}_slow.mp4"


# Clean up when we are done
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264"

Цей скрипт створює копію MP4 з посиланням _slow.

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