Existe-t-il un moyen de suspendre et de reprendre l'encodage FFmpeg?

14

J'enregistre chaque jour quelques heures de séquences vidéo, que je mets en file d'attente pour l'encodage ffmpeg. J'utilise le veryslowpréréglage avec x265, donc une seule heure de vidéo peut prendre jusqu'à 20 heures ou plus pour encoder.

Étant donné que mon ordinateur fonctionne jour et nuit, je me demande s'il ffmpegexiste un moyen de mettre en pause et de reprendre l' encodage? J'utilise Terminalpour OS X.

Si tel est le cas, puis-je également continuer d'encoder même après avoir arrêté Terminal et redémarré l'ordinateur? Je pense que la session Terminal est restaurée lorsque vous vous connectez à nouveau sous OS X, au moins l'historique du terminal l'est.

Drapeaux d'hiver
la source

Réponses:

14

Suspendre

Une méthode simple consiste à le suspendre avec ctrl+ z. Ou vous pouvez obtenir le PID avec pgrep ffmpegpuis utiliser kill -s SIGSTOP <PID>pour suspendre.

Reprenez ensuite avec la fgcommande ou kill -s SIGCONT <PID>.

Malheureusement, cela ne survivra pas à un redémarrage.

VM

Si vous utilisez une machine virtuelle, avec quelque chose comme VirtualBox, vous pouvez effectuer votre encodage dans une machine virtuelle invitée. Il vous permettra de "sauvegarder l'état de la machine" à tout moment et de survivre à un redémarrage. Il peut également vous permettre d'attribuer des ressources CPU maximales à l'invité afin que votre hôte ait toujours des ressources disponibles.

Peut-être exagéré, mais si vous êtes familier avec les machines virtuelles ou si vous en utilisez déjà une, c'est une solution possible.

llogan
la source
J'adore cette solution VM, cependant, à moins que vous n'en utilisiez déjà une, c'est un gros problème.
user24601
La méthode VirtualBox n'a pas fonctionné pour moi. J'ai essayé de sauvegarder l'état au milieu de l'encodage, et j'ai essayé de suspendre par [Ctrl] + [z] puis de sauvegarder l'état. Après avoir restauré l'état et tenté de reprendre, ffmpegs'arrête avec une erreur ( decode_band_types: Input buffer exhausted before END element foundou Invalid NAL unit sizeet Error writing trailer/ Protocol error). C'est peut-être lié au saut dans le temps, je ne sais pas.
Jānis Elmeris
@ JānisElmeris Je n'arrive pas à reproduire ce problème. Je l'ai essayé sur Ubuntu 18.04 VM et cela a fonctionné.
llogan
OK, je n'ai probablement pas la chance. :) Essayé avec une machine virtuelle VirtualBox Linux Mint 19.1 (basée sur Ubuntu 18.04).
Jānis Elmeris
mon ffmpeg a beaucoup de lancers et autant de PID. Dois-je SIGSTOP et SIGCONT chacun d'eux? y a-t-il une contrainte opportune?
wuppi
11

Sous Windows, appuyer sur la touche "Pause / Break" (la touche la plus en haut à droite) la mettra en pause. Enter reprendra.

Si cela ne fonctionne pas, cliquez sur la fenêtre d'invite de commande pour lui donner le focus.

BuckLee
la source
C'est la réponse la plus simple et la meilleure pour Windows (vérifiée sur Windows 10).
lidsinker
1
Cela libère complètement le processeur mais le bélier est toujours goulot d'étranglement. Dans mon cas, j'ai 8 Go de RAM et il en utilise presque toujours pendant que l'opération est en pause. Une solution pour ça? Puis-je le transférer sur le disque dur ou quelque chose? Je ne me dérange pas un peu de liquidation pour que les choses se mettent en marche lorsque je relance.
cerf
10

Cela ne semblait pas possible au 30 septembre 2015 . Je suggérerais de segmenter le fichier source, d'encoder les segments, puis d'assembler les fichiers résultants.

Ce n'est pas une véritable fonction de pause / reprise, mais la division fragmentaire vous permettra d'avoir une pause de l'encodage.

Un aperçu approximatif des commandes à émettre:

Divisez le fichier complet en plusieurs parties

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

Cela devrait créer file000.mp4, file001.mp4 et ainsi de suite. En raison de la façon dont le segmenteur fonctionne - il ne coupe que les images I - ces fichiers ne dureront pas exactement nquelques secondes et la partie vidéo peut ne pas être lue correctement, mais les données sont toutes là et vous pouvez convertir chacune des parties, par exemple

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

Rejoindre les parties encodées

Créez un fichier texte et entrez le nom de chaque fichier rendu comme ceci

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

Et courir

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4
Gyan
la source
Ayant seulement 6 Go de mémoire, et un temps estimé de 12h pour passer de x264 à x265 et n'ayant pas de pause (bureau), je ne peux pas utiliser l'astuce VM, mais cela sonne bien! Je m'attends juste à ce que l'étape de ralliement soit rapide, mais comme il n'y aura pas d'encodage dessus, je pense que ça le sera. Je dois l'essayer, thx vm!
Aquarius Power
cela crée un avertissement lors de l'adhésion: "Le codec pour le flux 0 n'utilise pas d'en-têtes globaux mais le format de conteneur nécessite des en-têtes globaux" mais le résultat final est une vidéo utilisable, je n'ai vu aucun problème
Aquarius Power
4

Je suggère qu'au lieu de faire une pause, vous donnez au processus d'encodage la moindre priorité système (alias " renice "), afin que vous puissiez travailler quotidiennement confortablement et l'encodage aura lieu en arrière-plan avec les ressources système inutilisées. Ainsi, votre encodage se fera de manière transparente 24h / 24 et 7j / 7 sans interruption, sans conflit avec le travail de jour

comme AFAIK OSX n'a ​​pas la commande pidof, vous devez connaître le numéro de processus ffmpeg (PID)

vous pouvez alors recommencer le processus en arrière-plan avec

sudo renice 20 yourPID

si nécessaire, vous pouvez également modifier le processus pour une priorité de premier plan plus agressive

sudo renice -10 yourPID
John Qube
la source
Salut! Bonne suggestion. Devra l'essayer.
Winterflags
4

La suspension du thread fonctionne également sous Windows, pas avec ctrl+ Z, mais dans le gestionnaire de ressources, vous pouvez également le reprendre là-bas.

Jan Christian Grünhage
la source
1

(Ceci pour Linux)

Comme vous le savez probablement tous, appuyer sur «q» met fin au fichier d'enregistrement.

ffplay a la possibilité 'p'. Pourquoi ffmpeg n'a-t-il pas la même chose? Peut-être parce que cela peut conduire à une désynchronisation entre la vidéo et l'audio? ...

Je viens de ffmpeg-encoder en x264-aac-mkv avec crf (23) et toujours avec les mêmes conditions vidéo, 'quitter' (q) les enregistrements et joindre tous les segments dans un répertoire spécifique, où réside ce script, dans 1 fichier en mode streamcopy avec ce 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 

Après cela, je vérifie la vidéo fusionnée résultante et la colle dans un autre répertoire. Les segments sont supprimés du répertoire de fusion.

Mais, un bouton `` Pause et reprise '' sans tracas serait le bienvenu;)

xinu
la source
0

Ce n'est qu'une idée, mais si vous avez un budget, ce serait une bonne idée de mettre à niveau le processeur (vers Intel de 8e génération) ou encore mieux, la carte vidéo (vers NVIDIA GTX 1050 ou au-dessus) afin que vous puissiez encoder h.265 / HEVC avec accélération matérielle au lieu de CPU-intensive x265. Votre encodage vidéo sera terminé en moins de 20 heures, ce qui vous fera également économiser de l'électricité.

Hendy Irawan
la source