web-dev-qa-db-fra.com

Comment modifier les paramètres ffmpeg -threads

Travailler sur un site tube . J'utilise des vidéos via ffmpeg sur un serveur dédié linux à convertir à mp4 .

Les spécifications du serveur:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               3491.749
BogoMIPS:              6983.49
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

Lors des tests, le problème est que même si vous ne faites que 4-5 à la fois, le serveur charge en flèche jusqu'à environ 36 en moyenne. Il ne s'agit que d'une seule personne. J'imagine que lors de son ouverture, de nombreuses personnes téléchargeront simultanément.

Il semble que ffmpeg tente d'utiliser toutes les ressources disponibles par conversion.

J'ai entendu dire qu'il est possible de modifier un paramètre de threads, mais je ne le trouve pas. J'ai un serveur de 8 cpu. Il est uniquement utilisé pour les conversions. Le meilleur paramètre compris entre 2 et 4 est donc le meilleur. Je peux le tester.

Mais comment changer ce réglage? Tout ce que je vois en ligne traite de ce paramètre, mais pas des étapes pour le changer.

14
Jacob

Le drapeau d'option que vous voulez est vraiment juste -threads et vous l'utiliseriez comme ceci (pour un seul thread):

ffmpeg -i somefile.wmv -c:a libfdk_aac -c:v libx264  -threads 1 transcoded.mp4

Cependant, il existe de nombreuses subtilités qui augmenteront la charge de votre serveur et le temps d’exploitation, telles que le redimensionnement, l’application de filtres et la qualité/débit d’image finale - sans oublier le fait que certaines architectures VM lisent tout écrire deux fois (une fois de manière native et une fois de manière virtuelle !!!)

Voici quelques astuces pour augmenter votre vitesse:

  1. utiliser une file d'attente, de sorte qu'un seul élément soit transcodé à la fois
  2. demander des fichiers plus petits à vos utilisateurs
  3. utilisez toute la puissance de votre machine en:
    • lire et écrire à partir d'un disque mémoire
    • passer au bare metal pour les tâches de transcodage
    • utiliser -threads 0

Quoi que vous fassiez, tenez vos utilisateurs informés du processus de transcodage, car cela prend du temps. (I.J.T.T.)

[commande modifiée pour refléter le commentaire de LordNeckbeard]

17
denjello

C'est peut-être un peu vieux, mais cela semble être une tâche parfaite pour un conteneur comme docker.

  • Laissez ffmpeg fonctionner avec full horsepower (comme l'appelait denjello)
  • mais laissez-le courir à l'intérieur du docker

Vous pouvez maintenant limiter la quantité de ressources qu'une instance ffmpeg peut consommer sans même utiliser les options de ligne de commande ffmpeg. Et pas seulement le processeur, mais aussi la mémoire et les IO.

Encore plus: peut-être que vous avez différentes tâches qui peuvent s'exécuter en arrière-plan, vous ne vous souciez pas du temps qu'elles prennent et que vous avez des tâches qui devraient s'exécuter rapidement, afin que vous puissiez peser différemment.

Voir https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources

Il existe déjà une image prédéfinie de ffmpeg sur github: https://github.com/jrottenberg/ffmpeg

docker run jrottenberg/ffmpeg \
        -i http://url/to/media.mp4 \
        -stats \
        $ffmpeg_options  - > out.mp4

Une seule conversion sera probablement plus lente en raison de la surcharge, mais si vous exécutez plusieurs instances simultanément, cela pourrait représenter un avantage considérable. Tout cela évoluera très bien, sans parler de la sécurité améliorée, car chaque tâche est isolée du système d'exploitation sous-jacent.

3
Jürgen Steinblock