Ricodifica della libreria video in x265 (HEVC) senza perdita di qualità


43

Sto cercando di convertire la mia libreria video in formato HEVC per guadagnare spazio. Ho eseguito il seguente comando su tutti i file video nella mia libreria:

#!/bin/bash
for i in *.mp4;
do 
    #Output new files by prepending "X265" to the names
    avconv -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

Ora, la maggior parte dei video si converte bene e la qualità è la stessa di prima. Tuttavia, alcuni video di qualità molto elevata (ad es. Una stampa di film di 5 GB) perdono qualità: il video è tutto pixelato.

Non sono sicuro di cosa fare in questo caso. Devo modificare il crfparametro nella mia riga di comando? O qualcos'altro?

Il fatto è che sto facendo una conversione in blocco. Quindi, ho bisogno di un metodo per avconvregolare automaticamente qualunque parametro debba essere regolato, per ogni video.

UPDATE 1-

Ho scoperto che crfè la manopola che devo regolare. Il CRF predefinito è 28. Per una migliore qualità, potrei usare qualcosa di meno di 28. Ad esempio:

avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4

Tuttavia, il problema è che per alcuni video il valore CRF di 28 è abbastanza buono, mentre per alcuni video è necessario un CRF inferiore. Questo è qualcosa che devo controllare manualmente convertendo piccole sezioni dei grandi video. Ma nella conversione collettiva, come posso controllare manualmente ogni video? È in qualche modo in avconvgrado di regolare il CRF in base al video di input in modo intelligente?

UPDATE 2-

Ho scoperto che esiste --losslessun'opzione in x265: http://x265.readthedocs.org/en/default/lossless.html .

Tuttavia, non so come usarlo correttamente. Ho provato a usarlo nel modo seguente ma ha prodotto risultati opposti (il video era ancora più pixelato):

avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4

1
--losslesspotrebbe infatti ingrandire il file, se decodifica il codec precedentemente in perdita e quindi racchiude ciò che ha decodificato senza perdita di dati. La qualità rimarrà esattamente la stessa dell'input.
Golar Ramblar,

2
Se le tue fonti sono codificate in perdita (che è molto probabilmente), ciò che stai cercando di ottenere è impossibile. Qualsiasi transcodifica che non sia senza perdita di dati peggiorerà ulteriormente la qualità (anche se non immediatamente visibile a voi) e se convertite da con perdita a perdita, otterrete file di dimensioni maggiori.
Sarge Borsch,

Risposte:


58

Dalla mia esperienza, se non vuoi assolutamente perdere la qualità, - è quello che stai cercando.

Non sono sicuro avconvma il comando che hai digitato sembra identico a quello che faccio FFmpeg. In FFmpegpuoi passare il parametro in questo modo:

ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv

La maggior parte degli x265switch (opzioni senza valore) può essere specificata in questo modo (ad eccezione di quelli solo CLI, quelli vengono utilizzati solo con x265binario direttamente).

Detto questo, vorrei condividere la mia esperienza con la x265codifica. Per la maggior parte dei video (sia WMV, MPEG o AVC / H.264) che uso crf=23. x265decide il resto dei parametri e di solito fa un lavoro abbastanza buono.

Tuttavia, spesso prima di impegnarmi a transcodificare un video nella sua interezza, collaudo le mie impostazioni convertendo una piccola parte del video in questione. Ecco un esempio, supponiamo che un file mkv con stream 0 sia video, stream 1 sia audio DTS e stream 2 sia un sottotitolo:

ffmpeg -hide_banner \
-ss 0 \
-i "INPUT.mkv" \
-attach "COVER.jpg" \
-map_metadata 0 \
-map_chapters 0 \
-metadata title="TITLE" \
-map 0:0 -metadata:s:v:0 language=eng \
-map 0:1 -metadata:s:a:0 language=eng -metadata:s:a:0 title="Surround 5.1 (DTS)" \
-map 0:2 -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:t:0 filename="Cover.jpg" -metadata:s:t:0 mimetype="image/jpeg" \
-c:v libx265 -preset ultrafast -x265-params \
crf=22:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 \
-c:a copy \
-c:s copy \
-t 120 \
"OUTPUT.HEVC.DTS.Sample.mkv"

Si noti che la linea del segnale rovesciato si interrompe in un lungo comando, lo faccio per aiutarmi a tenere traccia di vari bit di un input CLI complesso. Prima di spiegarlo riga per riga, la parte in cui converti solo una piccola parte di un video è la seconda riga e la seconda ultima riga: -ss 0significa cercare 0 secondi prima di iniziare a decodificare l'input e -t 120significa interrompere la scrittura nell'output dopo 120 secondi. Puoi anche utilizzare i formati ora hh: mm: ss o hh: mm: ss.sss.

Ora riga per riga:

  1. -hide_bannerimpedisce FFmpegdi mostrare le informazioni di build all'avvio. Non voglio vederlo quando scorro verso l'alto nella console;
  2. -ss 0cerca 0 secondi prima di iniziare a decodificare l'input. Si noti che se questo parametro viene fornito dopo il file di input e prima del file di output, diventa un'opzione di output e indica ffmpegdi decodificare e ignorare l'input fino a x secondi, quindi iniziare a scrivere nell'output. Come opzione di input è meno preciso (perché la ricerca non è accurata nella maggior parte dei formati contenitore), ma non richiede quasi tempo. Come opzione di output è molto preciso, ma richiede molto tempo per decodificare tutto il flusso prima del tempo specificato e ai fini del test non si vuole perdere tempo;
  3. -i "INPUT.mkv": Specifica il file di input;
  4. -attach "COVER.jpg": Consente di allegare una copertina (miniatura, poster, qualunque cosa) all'output. La copertina è di solito mostrata negli esploratori di file;
  5. -map_metadata 0: Copia su tutti i metadati dall'input 0, che nell'esempio è solo l'input;
  6. -map_chapters 0: Copia le informazioni sui capitoli (se presenti) dall'input 0;
  7. -metadata title="TITLE": Imposta il titolo del video;
  8. -map 0:0 ...: Mappa flusso 0 dell'input 0, il che significa che vogliamo che il primo flusso dall'input sia scritto nell'output. Poiché questo flusso è un flusso video, è il primo flusso video nell'output , quindi lo specificatore di flusso :s:v:0. Imposta il tag della lingua su inglese;
  9. -map 0:1 ...: Simile alla linea 8, mappa il secondo stream (audio DTS) e imposta la sua lingua e il titolo (per una più facile identificazione quando si sceglie dai giocatori);
  10. -map 0:2 ...: Simile alla riga 9, tranne per il fatto che questo stream è un sottotitolo;
  11. -metadata:s:t:0 ...: Imposta i metadati per la copertina. Questo è richiesto per il formato contenitore mkv;
  12. -c:v libx265 ...: Opzioni di codec video. È così lungo che l'ho diviso in due righe. Questa impostazione è buona per i video bluray di alta qualità (1080p) con bande minime in pendenza (che x265 succhia). Molto probabilmente è un eccesso per DVD, programmi TV e video telefonici. Questa impostazione è per lo più rubata da questo post di Doom9 ;
  13. crf=22:...: Continuazione dei parametri del codec video. Vedi il post del forum sopra menzionato;
  14. -c:a copy: Copia su audio;
  15. -c:s copy: Copia sui sottotitoli;
  16. -t 120: Interrompe la scrittura sull'output dopo 120 secondi, il che ci dà una clip di 2 minuti per l'anteprima della qualità di trancoding;
  17. "OUTPUT.HEVC.DTS.Sample.mkv": Nome del file di output. Taggo i nomi dei miei file con il codec video e il codec audio principale.

Accidenti. Questa è la mia prima risposta, quindi se c'è qualcosa che mi manca, lascia un commento. Non sono un esperto di produzione video, sono solo un ragazzo troppo pigro per guardare un film inserendo il disco nel lettore.

PS. Forse questa domanda appartiene a qualche altra parte in quanto non è fortemente correlata a Unix e Linux.


2
Esattamente quello che stavo cercando! Bella copertura di opzioni. Sai se ffmpeg si interromperà c:s copyse non ci sono contenuti per i sottotitoli?
Elder Geek,

1
@ElderGeek No, ffmpeg dirà qualcosa solo se quell'opzione ha qualche effetto.
Yifeng Mu

Questa opzione genera la dimensione del file più piccola possibile per una codifica h265 veramente senza perdita? In caso contrario, c'è un modo per farlo?
Buffer over Leggi l'

1
@TheBitByte Non credo che ci sia un livello di compressione senza perdita di dati in h265. Per l'opzione senza compressione, è solo --lossless. Ho cercato invano una conversione senza perdite da h264 a h265 e quello che ho imparato mi dice che è matematicamente impossibile.
Yifeng Mu,

1
Dovresti davvero modificare il comando contenente il --losslesspassaggio da questa risposta, perché inserendolo come risposta a questa domanda sembra che tu stia dicendo che è una compressione senza perdita, il che è fuorviante.
Hashim,

8

Di recente ho attraversato il problema della transcodifica del mio intero catalogo video su HEVC. Uso https://github.com/FallingSnow/h265ize con le seguenti impostazioni.

h265ize -v -m medium -q 20 -x --no-sao --aq-mode 3 --delete --stats

-v - Output dettagliato
-m medium - Velocità di codifica media (minore qualità superiore, qualsiasi cosa più lenta trovo non vale la differenza di tempo / qualità)
-q 20 - il CRF utilizzato, 20 è simile a 18 o giù di lì in x264 ma ehi. Questo è per i contenuti 1080p (90% della mia TV) Tendo a usare 22 per i miei film 4K
-x - Usa i comandi definiti centrali x265 - non
-sao disattiva Offset adattivo campione (migliora la velocità della codifica)
- modalità -aq 3 - usa la quantizzazione adattiva con varianza automatica, aiuta la codifica a 8 bit, specialmente nelle aree scure, ferma la maggior parte del banding che può accadere (a spese del tempo di codifica) -
elimina - sostituisci il file di codifica con il file codificato (prova prima di utilizzare questo )
--stats - Scrivi le statistiche in un file CSV nella radice del percorso da cui hai eseguito.

La velocità di codifica è di circa 30 fps (per la maggior parte delle cose a 1080p) sul mio rig. Dual Xeon E5 2687W v2, ma costringo il processo FFMPEG a non utilizzare il primo lato di uno dei processori (è il mio server Plex, quindi assicurati che ci sia un sovraccarico per la transcodifica se necessario durante la riproduzione, ecc.)

Sì, ci è voluto un po 'per convertire la maggior parte, e ora ho un'attività pianificata che viene eseguita due volte al giorno per codificare le cose da quel giorno in x265.

Il risparmio di spazio è stato enorme. La mia SAN iniziale era a 20 TB, ora è di circa 12 ma ovviamente è stata aggiunta anche con 6 mesi di contenuto in più.

Ho iniziato a transcodificare anche tutti i miei film, tuttavia, è un processo in corso, poiché devo identificare i livelli di qualità (Radarr fortunatamente le etichette quindi bene) e utilizzare una delle tre impostazioni di transcodifica:

-m slower -q 18 -x --no-sao --aq-mode 3per transcodifica 720p
-m medium -q 20 -x --no-sao --aq-mode 3per 1080p
-m medium -q 22 -x --no-saoper 2160p

Spero che questo aiuti alcune persone. Grida se qualcuno ha bisogno di una mano per impostare tutto. E prima di codificare tutto su x265, pensa alla riproduzione, se il client non supporta x265 nativo, il transcade può essere costoso in termini di CPU e qualità.


Con x265 2.4 e versioni successive (con le nuove tabelle lambda che offrono codifiche più nitide), SAO è generalmente una buona cosa per la qualità per bitrate. Spalma ancora leggermente, ma riduce abbastanza altri artefatti da valerne la pena.
Peter Cordes,

-q 20non è CRF 20, è un costante controllo del QP . La modalità predefinita e consigliata, CRF, aumenta il QP in scene ad alta complessità in modo da non spendere troppi bit in scene che sono troppo difficili da codificare. (Se vuoi avvicinarti a QP uniforme, qcompalzati dallo 0,6 predefinito a forse 0,7 o 0,8. Più vicino a 1,0 è più vicino a CQP.)
Peter Cordes,

3

La sintassi corretta per abilitare la modalità lossless per l'encoder x265 in ffmpeg è -x265-params lossless=1(è necessario aggiungere =1).

Tuttavia, per la codifica senza perdite ci sono scelte migliori di codec. Ho scoperto testando che FFV1 comprime molto meglio (dimensione del file = ~ 80% di x265) almeno su alcuni tipi di video (se si scelgono le migliori impostazioni per entrambi i codec). E funziona anche più velocemente e (AFAIK) non è gravato da brevetti. Cioè, è superiore all'H.265 senza perdita di dati in ogni modo per l'archiviazione video.

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.