Comment modifier les paramètres ffmpeg -threads

14

Travailler sur un site de tube . J'exécute des vidéos via ffmpeg sur un serveur dédié linux pour convertir en 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

Le problème pendant les tests est que, même en ne faisant que 4-5 à la fois, le serveur charge en moyenne environ 36 personnes. Il s'agit d'une seule personne. J'imagine qu'à l'ouverture, de nombreuses personnes téléchargeront en même temps.

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

J'ai entendu dire qu'il y a un paramètre -threads que vous pouvez modifier, mais je ne le trouve pas. J'ai un serveur 8 cpu. Il n'est utilisé que pour les conversions, j'ai donc entendu que le meilleur paramètre serait compris entre 2 et 4. Je peux le tester.

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


la source

Réponses:

17

Le drapeau d'option que vous voulez est vraiment juste -threadset 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 des opérations, telles que le redimensionnement, l'application de filtres et la qualité / fréquence de trame finale - sans parler du fait que certaines architectures de machine virtuelle lisent et écrivent tout deux fois (une fois en mode natif et une fois virtuellement !!!)

Voici quelques conseils pour accélérer:

  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. utiliser toute la puissance de votre machine en:
    • lire et écrire à partir d'un disque virtuel
    • passage au métal nu pour les tâches de transcodage
    • utilisation -threads 0

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

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

denjello
la source
10
Le placement des options est important. Avec -threadsavant l'entrée, vous appliquez cette option à l'entrée (le décodeur). Une utilisation généralisée est ffmpeg [global options] [input options] -i input [output options] output.
llogan
Alors, où suggéreriez-vous de le placer? Je pensais au début qu'il était appliqué à l'échelle mondiale?
denjello
3
En tant qu'option de sortie, il devient une option de codage. Consultez la documentation FFmpeg pour afficher les options marquées comme (global).
llogan
est-ce important si vous mettez l' -threadsargument avant ou après l' -iargument? De plus, comment dois-je déterminer le nombre de threads à utiliser? Je suis juste en train de faire-c copy
chovy
3

Cela 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 de docker

Vous pouvez maintenant limiter la quantité de ressources qu'une seule 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 E / S.

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

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

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

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

Une conversion unique s'exécutera probablement plus lentement en raison de la surcharge, mais si vous exécutez plusieurs instances simultanément, cela pourrait être un énorme avantage. 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.

Jürgen Steinblock
la source
N'est-ce pas un peu extrême de l'exécuter dans Docker? Il existe littéralement de nombreuses autres meilleures façons de limiter l'utilisation du processeur sur Linux scoutapm.com/blog/…
yurtesen
Pourquoi? Considérez que Docker est déjà installé, exécuter un conteneur avec --rmindicateur pour effectuer une tâche et supprimer le conteneur après la sortie est une chose tout à fait normale que les administrateurs pourraient et devraient faire en 2019. Surtout pour des choses comme la conversion de documents. La conversion échoue? Essayez une autre version du convertisseur sans mettre à niveau / rétrograder votre chaîne d'outils locale? Vous ne faites pas confiance au document car il a été téléchargé sur Internet? Isolez la tâche dans un conteneur. Ffmpeg ne fait pas exception. cvedetails.com/vulnerability-list/vendor_id-3611/Ffmpeg.html
Jürgen Steinblock
Cela ressemble à un discours marketing. Docker n'est pas parfait comme vous le dites -> techbeacon.com/security/… Sous Linux, un utilisateur normal bénéficie également d'un accès limité et de la sécurité du système. Les rétrogradations de version de programme sont très rares et peuvent être effectuées via le référentiel. De nombreuses images de docker sont faites par des personnes aléatoires. L'image du docker du convertisseur de documents a peut-être été compromise et une copie de tous vos documents a été envoyée à un serveur distant. Ainsi, l'utilisation d'images docker augmente la possibilité d'une telle vulnérabilité. Et alors?
yurtesen
Perhaps the document converter docker image was compromised and sent copy of all your documents to a remote server. So, using docker images increase possibility such vulnerability. What then?consultez le dépôt, examinez le fichier docker et utilisez-le docker build -t myimagepour créer vous-même une image locale. Ou créez votre propre dockerfile, ce n'est pas sorcier github.com/alfg/docker-ffmpeg/blob/master/Dockerfile
Jürgen Steinblock