Existe uma maneira de pausar e retomar a codificação FFmpeg?

14

Gravo algumas horas de vídeo todos os dias, as quais coloco na fila para codificação ffmpeg. Como uso a veryslowpredefinição x265, uma única hora de vídeo pode levar até 20 horas ou mais para codificar.

Como meu computador está trabalhando dia e noite, estou me perguntando se ffmpeghá uma maneira de pausar e retomar a codificação? Estou usando Terminalpara o OS X.

Nesse caso, também posso continuar codificando mesmo após desligar o Terminal e reiniciar o computador? Acho que a sessão do Terminal é restaurada quando você faz login novamente no OS X, pelo menos o histórico do Terminal é.

Winterflags
fonte

Respostas:

14

Suspender

Um método simples é suspendê-lo com ctrl+ z. Ou você pode obter o PID pgrep ffmpege usar kill -s SIGSTOP <PID>para suspender.

Em seguida, retome com o fgcomando ou kill -s SIGCONT <PID>.

Infelizmente, isso não sobreviverá a uma reinicialização.

VM

Se você usar uma máquina virtual, com algo como o VirtualBox, poderá executar sua codificação em uma VM convidada. Isso permitirá que você "salve o estado da máquina" a qualquer momento que possa sobreviver a uma reinicialização. Também pode permitir que você atribua recursos máximos de CPU para o convidado, para que seu host sempre tenha recursos disponíveis.

Possivelmente exagero, mas se você já conhece as VMs ou está usando uma, é uma solução possível.

llogan
fonte
Eu amo essa solução de VM, no entanto, a menos que você já esteja usando uma, é um grande aborrecimento.
user24601
A maneira do VirtualBox não funcionou para mim. Tentou apenas salvar o estado na codificação intermediária e tentou suspender com [Ctrl] + [z] e, em seguida, salve o estado. Após restaurar o estado e tentar retomar, ffmpegpara com um erro ( decode_band_types: Input buffer exhausted before END element foundou Invalid NAL unit sizee Error writing trailer/ Protocol error). Talvez esteja relacionado ao salto no tempo, não sei.
Jānis Elmeris 01/04/19
@ JānisElmeris Não consigo duplicar esse problema. Eu tentei no Ubuntu 18.04 VM e funcionou.
Llogan 01/04/19
OK, provavelmente não tenho sorte o suficiente. :) Tentei com um novo Linux Mint 19.1 (baseado no Ubuntu 18.04) VirtualBox VM.
Jānis Elmeris 02/04/19
meu ffmpeg tem muitos lançamentos e tantos PID. Eu tenho que SIGSTOP e SIGCONT cada um deles? existe uma restrição oportuna?
Wuppi 16/07/19
10

Não parecia possível em 30 de setembro de 2015 . Eu sugeriria segmentar o arquivo de origem, codificar os segmentos e depois costurar os arquivos resultantes.

Este não é um recurso real de pausa / retomada, mas a divisão fragmentada permitirá que você faça uma pausa na codificação.

Uma visão geral aproximada dos comandos a serem emitidos:

Quebrar o arquivo completo em partes

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

Isso deve criar file000.mp4, file001.mp4 e assim por diante. Por causa de como o segmentador funciona - ele só corta nos quadros I - esses arquivos não duram exatamente nsegundos e a parte do vídeo pode não ser reproduzida corretamente, mas os dados estão todos lá e você pode converter cada uma das partes, por exemplo

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

Voltar a juntar as partes codificadas

Crie um arquivo de texto e coloque o nome de cada arquivo renderizado como este

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

E corra

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4
Gyan
fonte
Tendo apenas 6 GB de memória e um tempo estimado de 12h para acomodar de x264 a x265 e sem interrupção (desktop), não posso usar o truque da VM, mas isso parece ótimo! Só espero que a etapa de retorno seja rápida, mas como não haverá codificação, acho que será. Tem que tentar, thx vm!
Aquarius Power
ele cria um aviso quando entrar: "Codec para o córrego 0 não usa cabeçalhos globais, mas formato contêiner requer cabeçalhos globais", mas o resultado final é um vídeo utilizável, eu vi nenhum problema em tudo
Aquarius Poder
10

No Windows, pressionar a tecla "Pausar / Interromper" (a tecla superior direita) fará uma pausa. Enter será retomado.

Se não funcionar, clique na janela do prompt de comando para focar.

BuckLee
fonte
Esta é a melhor e mais fácil resposta para o Windows (verificada no Windows 10).
Lidsinker
1
Isso libera completamente a CPU, mas o carneiro ainda está com gargalo. No meu caso, tenho 8 GB de RAM e ele está usando quase tudo ainda enquanto a operação está em pausa. Alguma correção para isso? Posso transferir isso para o disco rígido ou algo assim? Eu não me importo um pouco para acabar as coisas quando eu pausar.
Kite
4

Sugiro que, em vez de pausar, você dê ao processo de codificação a menor prioridade do sistema (também conhecida como " renice "), para que você possa trabalhar diariamente confortavelmente e a codificação ocorrerá em segundo plano com os recursos não utilizados do sistema. Portanto, sua codificação ocorrerá sem interrupções, 24 horas por dia, 7 dias por semana, sem interrupções, sem entrar em conflito com o dia de trabalho

Como o AFAIK OSX não possui o comando pidof, você precisa saber o número do processo ffmpeg (PID)

então, você pode renomear o processo para ocioso segundo plano com

sudo renice 20 yourPID

se necessário, você também pode renomear o processo para uma prioridade mais agressiva em primeiro plano

sudo renice -10 yourPID
John Qube
fonte
Oi! Boa sugestão. Terá que tentar.
Winterflags
4

Suspender o Encadeamento também funciona no Windows, não com o ctrl+ Z, mas no gerenciador de recursos, você também pode continuar lá.

Jan Christian Grünhage
fonte
1

(Isso para Linux)

Como todos sabem, pressionar 'q' encerra o arquivo de gravação.

O ffplay tem a possibilidade 'p'. Por que ffmpeg não tem a mesma coisa? Talvez porque possa levar à dessincronização entre vídeo e áudio? ...

Eu apenas codifico ffmpeg para x264-aac-mkv com crf (23) e sempre com as mesmas condições de vídeo, 'encerro' (q) as gravações e uno todos os segmentos em um diretório específico, onde este script reside, a 1 arquivo no modo streamcopy com este script 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 

Depois disso, verifico o vídeo mesclado resultante e o colo em outro diretório. Os segmentos são removidos do diretório de mesclagem.

Mas um botão 'Pausar e Continuar' sem problemas seria bem-vindo;)

xinu
fonte
0

Isso é apenas uma ideia, mas se você tiver algum orçamento, seria uma boa ideia atualizar o processador (para Intel de 8a geração) ou, melhor ainda, a placa de vídeo (para NVIDIA GTX 1050 ou superior) para codificar h.265 / HEVC com aceleração de hardware em vez de CPU intensiva x265. Sua codificação de vídeo será concluída em muito menos de 20 horas, economizando também custos de eletricidade.

Hendy Irawan
fonte