Чи є спосіб призупинити та відновити кодування FFmpeg?


14

Я щодня записую кілька годин відеоматеріалів, які я встановлюю в чергу для кодування ffmpeg. Я використовую veryslowпопередньо встановлену функцію x265, тому для кодування однієї години відео може знадобитися до 20 годин і більше.

Оскільки мій комп'ютер працює вдень і вночі, мені цікаво, чи ffmpegє спосіб призупинити та відновити кодування? Я використовую Terminalдля OS X.

Якщо так, чи можу я продовжувати кодування навіть після вимкнення терміналу та перезавантаження комп'ютера? Я думаю, що сеанс терміналу відновлюється, коли ви знову входите в OS X, принаймні історія терміналу є.

Відповіді:


14

Призупинити

Простий метод - призупинити його за допомогою ctrl+ z. Або ви можете отримати PID, після pgrep ffmpegчого використовуйте kill -s SIGSTOP <PID>для призупинення.

Потім відновіть fgкоманду або kill -s SIGCONT <PID>.

На жаль, це не переживе перезавантаження.

ВМ

Якщо ви використовуєте віртуальну машину з чимось на зразок VirtualBox, ви можете виконати кодування в гостьовій машині. Це дозволить вам "зберегти стан машини" в будь-який час, який може пережити перезавантаження. Це також може дозволити призначити максимум ресурсів процесора для гостя, щоб ваш хост завжди мав доступні ресурси.

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


Я люблю це рішення VM, окрім випадків, коли ви вже використовуєте його, це досить великі клопоти.
user24601

Шлях VirtualBox не працював для мене. Намагався просто зберегти стан у середині кодування, і спробував призупинити [Ctrl] + [z], а потім зберегти стан. Після відновлення стану та спроби відновлення ffmpegзупиняється з помилкою ( decode_band_types: Input buffer exhausted before END element foundабо Invalid NAL unit sizeта Error writing trailer/ Protocol error). Можливо, це пов’язано зі стрибком у часі, я не знаю.
Jānis Elmeris

@ JānisElmeris Я, здається, не може дублювати це питання. Я спробував це на Ubuntu 18.04 VM, і він спрацював.
llogan

Гаразд, напевно, мені не пощастило. :) Пробував зі свіжим Linux Mint 19.1 (на базі Ubuntu 18.04) VirtualBox VM.
Яніс Елмеріс

мій ffmpeg має багато дротів та стільки ж PID. Чи потрібно мені SIGSTOP і SIGCONT кожен з них? чи є своєчасне обмеження?
wuppi

12

У Windows натискання клавіші "Призупинити / перервати" (сама права клавіша вгорі) призупинить. Enter відновиться.

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


Це найпростіша і найкраща відповідь для Windows (перевірена в Windows 10).
lidsinker

1
Це повністю звільняє процесор, але баран все ще вузький. У моєму випадку у мене є 8 Гб оперативної пам’яті, і він майже весь час використовує його, поки операція призупинена. Будь-яке виправлення для цього? Чи можу я перенести це на HDD чи щось таке? Я не заперечую трохи виграшу для речей, які можна розпочати, коли я відключаю.
кайт

10

Це не здавалося можливим станом на 30 вересня 2015 року . Я б запропонував сегментувати вихідний файл, кодувати сегменти, а потім зшивати отримані файли.

Це не справжня пауза / відновлення, але роздільний фрагмент дозволить вам відмовитися від кодування.

Приблизний огляд команд для видачі:

Розбийте повний файл на частини

ffmpeg -i recording.mp4 -c copy -flags +global_header -segment_time n -f segment file%03d.mp4

Це має створити file000.mp4, file001.mp4 тощо. Через те, як працює сегментатор - він ріже лише на I-кадрах - ці файли не будуть тривати рівно nсекунди, і відео-частина може не відтворюватись належним чином, але дані є все, і ви можете конвертувати кожну частину, наприклад

ffmpeg -i file001.mp4 -{filter/encoding parameters} -fflags +genpts file001-new.mp4

Приєднайтеся до закодованих деталей

Створіть текстовий файл і введіть ім’я кожного виведеного файлу, як це

file 'file000-new.mp4'
file 'file001-new.mp4'
.... 
file 'filelast-new.mp4'

І біжи

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4

Маючи лише 6 Гб оперативної пам’яті та орієнтовний час в 12 годин, щоб продовжити від x264 до x265 і не мати перерви (настільний), я не можу використовувати фокус VM, але це звучить чудово! Я просто очікую, що крок, що з'єднується, швидкий, але оскільки кодування на ньому не буде, я думаю, що це буде. Треба спробувати, thx vm!
Сила Водолія

він створює попередження під час приєднання: "Кодек для потоку 0 не використовує глобальних заголовків, але для формату контейнерів потрібні глобальні заголовки", але кінцевий результат - це корисне відео, я взагалі не бачив жодних проблем
Водолій Power

4

Я підказую, замість паузи, ви надаєте процесу кодування найменший системний пріоритет (він же " renice "), так що ви можете працювати щодня комфортно, і кодування буде проходити у фоновому режимі з невикористаними ресурсами системи. Таким чином, ваше кодування буде проходити безшовно 24/7 без перерв, без конфлікту з роботою дня

оскільки AFAIK OSX не має команди pidof, вам потрібно знати номер процесу ffmpeg (PID)

тоді ви можете відновити процес, щоб вимкнути фон

sudo renice 20 yourPID

при необхідності ви також можете відновити процес до більш агресивного пріоритету переднього плану

sudo renice -10 yourPID

Привіт! Гарна пропозиція. Доведеться спробувати.
Winterflags

4

Призупинення роботи теми також працює в Windows, не з ctrl+ Z, але в диспетчері ресурсів ви також можете відновити її там.


1

(Це для Linux)

Як ви, напевно, всі знаєте, натисканням кнопки «q» закінчується файл запису.

ffplay має 'p' можливість. Чому ffmpeg не має того самого? Може тому, що це може призвести до десинхронізації між відео та аудіо? ...

Я просто ffmpeg-кодую до x264-aac-mkv з crf (23) і завжди з однаковими умовами відеозапису, 'вийміть' (q) з записів і приєднайтеся до всіх сегментів у конкретному режимі, де знаходиться цей сценарій, до 1 файлу в режимі потокового копіювання за допомогою цього bash-скрипту:

#!/bin/bash

# FFMPEG MERGE

# File path must be absolutely absolute...

ffmpeg -f concat -safe 0 -i <(printf "file '%s'\n" /home/me/Videos/FFmpeg/FFmpeg_Merge/*.mkv) -c copy merged.mkv

exit 

Після цього я перевіряю отримане об’єднане відео і вставляю його в інший dir. Сегменти видаляються з об'єднання реж.

Але дійсно вітається кнопка "Призупинити та відновити";)


0

Це просто ідея, але якщо у вас є якийсь бюджет, було б непогано модернізувати або процесор (до Intel 8-го покоління), або ще краще, відеокарту (до NVIDIA GTX 1050 або вище), щоб ви могли кодувати h.265 / HEVC з апаратним прискоренням замість процесора x265. Кодування відео буде завершено набагато менше ніж за 20 годин, що також заощадить ваші витрати на електроенергію.

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