Come modificare le impostazioni di ffmpeg -threads


14

Lavorando su un sito di tubi . Sto eseguendo video tramite ffmpeg su un server dedicato linux da convertire in mp4 .

Le specifiche del server:

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

Il problema durante il test è che anche facendo solo 4-5 alla volta, il server carica i razzi in media intorno a 36. Questa è solo una persona. Immagino che quando si aprirà, molte persone caricheranno contemporaneamente.

Sembra che ffmpeg tenti di utilizzare tutte le risorse disponibili per conversione.

Ho sentito che c'è un'impostazione di threads che puoi cambiare, ma non riesco a trovarla. Ho un server 8 cpu. Viene utilizzato solo per le conversioni, quindi ho sentito che l'impostazione migliore sarebbe tra 2 e 4. Posso provarlo.

Ma come posso cambiare questa impostazione? Tutto ciò che vedo online discute questa impostazione, ma non i passaggi per modificarla.

linux  ffmpeg  cpu  mp4 

Risposte:


17

L'opzione flag che vuoi è davvero giusta -threadse la useresti così (per un solo thread):

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

Tuttavia, ci sono alcune sottigliezze che aumenteranno il carico del server e il tempo di funzionamento, come il riscalamento, l'applicazione di filtri e la qualità / frequenza dei fotogrammi finali - per non parlare del fatto che alcune architetture di macchine virtuali leggono e scrivono tutto due volte (una volta in modo nativo e una volta praticamente !!!)

Ecco alcuni suggerimenti per aumentare la velocità:

  1. utilizzare una coda, in modo che venga transcodificato un solo elemento alla volta
  2. richiedere file più piccoli ai tuoi utenti
  3. usa tutta la potenza della tua macchina:
    • leggere e scrivere da un ramdisk
    • passare al bare metal per le attività di transcodifica
    • uso -threads 0

Qualunque cosa tu faccia, tieni i tuoi utenti informati sul processo di transcodifica, perché richiede solo tempo. (IJTT)

[comando modificato per riflettere il commento di LordNeckbeard]


10
Il posizionamento delle opzioni è importante. Con -threadsprima dell'ingresso si applica questa opzione all'ingresso (il decodificatore). Un uso generalizzato è ffmpeg [global options] [input options] -i input [output options] output.
Llogan,

Quindi dove suggeriresti di posizionarlo? All'inizio pensavo che fosse applicato a livello globale?
Denjello,

3
Come opzione di output, diventa un'opzione di codifica. Vedere la documentazione di FFmpeg per visualizzare le opzioni contrassegnate come (global).
Llogan,

importa se metti l' -threadsarg prima o dopo l' -iarg? Inoltre, come devo determinare quanti thread dovrei usare? Sto facendo fondamentalmente solo-c copy
Chovy

3

Questo potrebbe essere un po 'vecchio, ma sembra un compito perfetto per un container come docker.

  • Lascia correre ffmpeg full horsepower(come lo chiamava denjello)
  • ma lasciarlo funzionare all'interno della finestra mobile

Ora puoi limitare quante risorse può consumare una singola istanza di ffmpeg senza nemmeno usare le opzioni della riga di comando di ffmpeg. E non solo CPU ma anche memoria e IO.

Ancora di più: forse hai diverse attività che possono essere eseguite in background e non ti interessa quanto tempo impiegano e hai attività che dovrebbero essere eseguite rapidamente, in modo da poter dare un peso a diverse attività.

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

Esiste già un'immagine ffmpeg predefinita su github: https://github.com/jrottenberg/ffmpeg

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

Una singola conversione verrà probabilmente eseguita più lentamente a causa del sovraccarico, ma se si eseguono contemporaneamente più istanze questo potrebbe essere un enorme vantaggio. Tutto ciò scalerà molto bene, per non parlare del miglioramento della sicurezza perché ogni attività è isolata dal sistema operativo sottostante.


Non è un po 'estremo eseguirlo all'interno della finestra mobile? Ci sono letteralmente molti altri modi migliori per limitare l'utilizzo del processore su Linux scoutapm.com/blog/…
yurtesen

Perché? Considera di avere già installato una finestra mobile, eseguire un contenitore con --rmflag per eseguire un'attività e rimuovere il contenitore dopo l'uscita è una cosa del tutto normale che gli amministratori potrebbero e dovrebbero fare nel 2019. Soprattutto per cose come la conversione dei documenti. La conversione fallisce? Prova un'altra versione del convertitore senza aggiornare / downgrade la tua toolchain locale? Non ti fidi del documento perché è stato scaricato da Internet? Isolare l'attività in un contenitore. Ffmpeg non fa eccezione. cvedetails.com/vulnerability-list/vendor_id-3611/Ffmpeg.html
Jürgen Steinblock

Sembra parlare di marketing. Docker non è perfetto come hai detto tu -> techbeacon.com/security/… In Linux un utente normale gode anche di accesso limitato e sicurezza del sistema. La necessità di downgrade della versione del programma è molto rara e può essere effettuata tramite repository. Molte immagini docker sono realizzate da persone a caso. Forse l'immagine della finestra mobile del convertitore di documenti è stata compromessa e ha inviato una copia di tutti i documenti a un server remoto. Quindi, l'uso delle immagini docker aumenta la possibilità di tale vulnerabilità. Cosa poi?
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?controllare il repository, esaminare il file docker e utilizzare docker build -t myimageper creare un'immagine locale da soli. O crea il tuo file docker, non è missile scienza github.com/alfg/docker-ffmpeg/blob/master/Dockerfile
Jürgen Steinblock
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.