Есть ли способ приостановить и возобновить кодирование FFmpeg?

14

Я записываю несколько часов видео каждый день, которые я ставлю в очередь для кодирования ffmpeg. Я использую veryslowпредустановку с x265, так что один час видео может занять до 20 часов или более для кодирования.

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

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

Winterflags
источник

Ответы:

14

приостановить

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

Затем возобновите с fgкомандой или kill -s SIGCONT <PID>.

К сожалению, это не переживет перезагрузку.

В.М.

Если вы используете виртуальную машину с чем-то вроде VirtualBox, вы можете выполнить кодирование в гостевой виртуальной машине. Это позволит вам «сохранить состояние машины» в любое время, которое может пережить перезагрузку. Это также может позволить вам назначить максимальное количество ресурсов ЦП для гостя, чтобы у вашего хоста всегда были доступные ресурсы.

Возможно, это излишнее, но если вы уже знакомы с виртуальными машинами или уже используете их, это возможное решение.

llogan
источник
Однако мне нравится это решение для виртуальных машин, если только вы не используете его, это довольно большая проблема.
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ānisElmeris Я не могу дублировать эту проблему. Я попробовал это на Ubuntu 18.04 VM, и это работало.
19
ОК, наверное, мне не повезло. :) Пробовал со свежим Linux Mint 19.1 (на основе Ubuntu 18.04) VirtualBox VM.
Янис Элмерис
мой ffmpeg имеет много threds и столько же PID. Должен ли я SIGSTOP и SIGCONT каждый из них? есть ли своевременное ограничение?
Вуппи
11

В Windows нажатие клавиши «Pause / Break» (самая правая верхняя клавиша) приостановит ее. Enter возобновит.

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

BuckLee
источник
Это самый простой и лучший ответ для Windows (проверено в Windows 10).
Lidsinker
1
Это полностью освобождает процессор, но баран все еще остается узким местом. В моем случае у меня есть 8 ГБ оперативной памяти, и он использует почти все это все еще, пока операция приостановлена. Любое исправление для этого? Могу ли я перенести это на жесткий диск или что-то? Я не возражаю против того, чтобы дела начались, когда я сделал паузу.
воздушный змей
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
Gyan
источник
Имея только 6 ГБ памяти и приблизительное время 12 часов для преобразования из x264 в x265 и не имея бесперебойного (настольного компьютера), я не могу использовать трюк с виртуальной машиной, но это звучит здорово! Я просто ожидаю, что шаг присоединения будет быстрым, но, поскольку на нем не будет кодировки, я думаю, что так и будет. Должен попробовать это, спасибо VM!
Водолей Power
он создает предупреждение при присоединении: «Кодек для потока 0 не использует глобальные заголовки, но формат контейнера требует глобальных заголовков», но в конечном итоге это пригодное для использования видео, я вообще не видел проблем
Aquarius 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 файл в режиме streamcopy с помощью этого 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 

После этого я проверяю полученное объединенное видео и вставляю его в другой каталог. Сегменты удаляются из слияния реж.

Но беспроблемная кнопка «Пауза и Возобновление» действительно приветствуется;)

xinu
источник
0

Это просто идея, но если у вас есть какой-то бюджет, было бы неплохо обновить либо процессор (до 8-го поколения Intel), либо даже лучше, видеокарту (до NVIDIA GTX 1050 или выше), чтобы вы могли кодировать h.265 / HEVC с аппаратным ускорением вместо интенсивного использования процессора x265. Ваше кодирование видео будет завершено менее чем за 20 часов, что также сэкономит вам расходы на электроэнергию.

Хенди ираван
источник