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 viene convertita bene e la qualità è la stessa di prima. Tuttavia, alcuni video di qualità molto elevata (ad esempio una stampa di un film da 5 GB) perdono qualità: il video è tutto pixelato.
Non sono sicuro di cosa fare in questo caso. Devo modificare il parametro crf
nella mia riga di comando? O qualcosaltro?
Il fatto è che sto eseguendo una conversione in blocco. Quindi, ho bisogno di un metodo in cui avconv
regola automaticamente i parametri da modificare, 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 CRF un valore di 28 è abbastanza buono, mentre per alcuni video è richiesto un CRF inferiore. Questo è qualcosa che devo controllare manualmente convertendo piccole sezioni dei grandi video. Ma nella conversione in blocco, come faccio a controllare manualmente ogni video? È in qualche modo che avconv
può regolare il CRF in base al video in ingresso in modo intelligente?
UPDATE-2
Ho scoperto che esiste un --lossless
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
Commenti
Risposta
In base alla mia esperienza, se non vuoi assolutamente perdere la qualità, –lossless è quello che stai cercando.
Non sono sicuro di avconv
ma il comando che hai digitato sembra identico a quello che faccio con FFmpeg
. In FFmpeg
puoi passare il parametro in questo modo:
ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv
La maggior parte della x265
(opzioni senza valore) possono essere specificati in questo modo (eccetto quelli solo CLI, quelli vengono utilizzati solo con x265
binario direttamente).
Detto questo, vorrei “condividere la mia esperienza con la codifica x265
. Per la maggior parte dei video (WMV, MPEG o AVC /H.264) Uso crf=23
. x265
decide il resto dei parametri e di solito fa un lavoro abbastanza buono.
Tuttavia, spesso, prima di impegnarmi a transcodificare un video nella sua interezza, provo 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 essendo audio DTS e lo streaming 2 come 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"
Nota che la riga del segnale delle barre rovesciate si interrompe in un comando lungo, lo faccio per aiutarmi a tenere traccia di vari bit di un ingresso 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 penultima riga: -ss 0
significa cercare 0 secondo prima inizia a decodificare linput e -t 120
significa interrompere la scrittura nelloutput dopo 120 secondi. Puoi anche utilizzare i formati ora hh: mm: ss o hh: mm: ss.sss.
Ora riga per riga:
-
-hide_banner
impedisce aFFmpeg
di mostrare le informazioni sulla build allavvio. Semplicemente non “voglio vederlo quando scorro verso lalto nella console; -
-ss 0
cerca a 0 secondi prima di iniziare a decodificare linput. Nota che se questo parametro viene fornito dopo il file di input e prima del file di output, diventa un opzione di output e indicaffmpeg
per decodificare e ignorare linput fino a x secondi, quindi iniziare a scrivere nelloutput Come opzione di input è meno accurato (perché la ricerca non è accurata nella maggior parte dei formati contenitore), ma non richiede quasi tempo.Come opzione di output è molto preciso ma richiede una notevole quantità di tempo per decodificare tutto il flusso prima del tempo specificato e, a scopo di test, non si vuole perdere tempo; -
-i "INPUT.mkv"
: specifica il file di input; -
-attach "COVER.jpg"
: allega una copertina (immagine in miniatura, poster, qualunque cosa) alloutput. la copertina viene solitamente mostrata in Esplora file; -
-map_metadata 0
: copia tutti i metadati dallinput 0, che nellesempio è solo linput; -
-map_chapters 0
: copia le informazioni sul capitolo (se presenti) dallinput 0; -
-metadata title="TITLE"
: Imposta il titolo del video; -
-map 0:0 ...
: mappare lo stream 0 dellinput 0, il che significa che vogliamo che il primo stream dallinput venga scritto nelloutput Poiché questo stream è uno stream video, è il primo stream video nell output , da cui lidentificatore di stream:s:v:0
. Imposta la sua lingua tag in inglese; -
-map 0:1 ...
: simile alla riga 8, mappare il secondo flusso (audio DTS) e impostarne la lingua e il titolo (per una più facile identificazione quando si sceglie dai giocatori); -
-map 0:2 ...
: simile alla riga 9, tranne che questo stream è un sottotitolo; -
-metadata:s:t:0 ...
: imposta i metadati per la copertina. È richiesto per il formato contenitore mkv; -
-c:v libx265 ...
: opzioni codec video. È così lungo che lho suddiviso in due righe. Questa impostazione è buona per video bluray di alta qualità (1080p) con banding minimo nel gradiente (che x265 fa schifo). Molto probabilmente è eccessivo per DVD, programmi TV e video telefonici. Questa impostazione è per lo più rubata da questo post di Doom9 ; -
crf=22:...
: continuazione del codec video parametri. Vedi il post del forum citato sopra; -
-c:a copy
: Copia tramite audio; -
-c:s copy
: Copia sui sottotitoli; -
-t 120
: interrompi la scrittura nelloutput dopo 120 secondi, il che ci fornisce una clip di 2 minuti per lanteprima della qualità del trancoding; -
"OUTPUT.HEVC.DTS.Sample.mkv"
: nome del file di output. Taggo i miei nomi di file con il codec video e il codec audio principale.
Whew. Questa è la mia prima risposta, quindi se cè qualcosa che mi è sfuggito, lascia un commento. Non sono un esperto di produzione video, sono solo un ragazzo che è troppo pigro per guardare un film inserendo il disco nel lettore.
PS. Forse questa domanda appartiene a qualcosaltro in quanto non è strettamente correlato a Unix & Linux.
Commenti
- Esattamente quello che stavo cercando ! Bella copertura di opzioni. Sai se ffmpeg si opporrà a
c:s copy
se non cè il contenuto dei sottotitoli? - @ElderGeek No, ffmpeg dirà qualcosa solo se questa opzione ha effetto.
- @TheBitByte Sì e no, credo. Non ‘ vuoi file h265 senza perdita di dati. È ‘ solo un flusso di bit non elaborato senza alcun tipo di compressione. È ‘ enorme. Da quello che ho capito sullimplementazione h265 o specificamente x265, non è un metodo di compressione senza perdite. Qualsiasi grado di compressione comporterà la perdita di informazioni, ma non necessariamente la perdita della qualità di visualizzazione. Ma ‘ non sono un esperto di argomenti h265, quindi ‘ è possibile che mi sia perso qualcosa
- @ TheBitByte Non ‘ penso che ci sia un livello di compressione senza perdite in h265. Per lopzione 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. - Dovresti davvero modificare il comando contenente lopzione
--lossless
fuori da questa risposta, perché messo lì come risposta a questa domanda suona come te ‘ sta dicendo la ‘ s compressione senza perdita di dati, il che è fuorviante.
Risposta
Recentemente ho avuto il problema di transcodificare lintero catalogo video in HEVC. Utilizzo 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 – Medio velocità di codifica (minore qualità superiore, qualsiasi cosa più lenta non valga il tempo / qualità dif)
-q 20 – il CRF utilizzato, 20 è simile a 18 o giù di lì in x264 ma hey.Questo è per i contenuti 1080p (90% della mia TV). Tendo a usare 22 per i miei film 4K
-x – Utilizza i comandi definiti centralmente x265
–no-sao disattiva Sample Adaptive Offset (migliora la velocità di codifica)
–aq-mode 3 – usa la quantizzazione adattiva con varianza automatica, aiuta a codificare a 8 bit, specialmente nelle aree scure, si ferma la maggior parte del banding che può verificarsi (a scapito del tempo di codifica)
–delete – sostituisci il file di codifica con file codificato (test prima di utilizzare questo)
–stats – Scrivi le statistiche in un file csv nella radice del percorso da cui sei corso.
Le velocità di codifica sono 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 overhead per la transcodifica se necessario durante la riproduzione, ecc.)
Sì, ci è voluto un po per convertirne la maggior parte e ora ho unattività pianificata che viene eseguita due volte al giorno per codificare le cose da quel giorno in x265.
Il risparmio di spazio sono stati enormi. La mia SAN iniziale era di 20 TB, ora è di circa 12 ma ovviamente è stata aggiunta anche con 6 mesi di contenuti in più.
Ho iniziato a transcodificare anche tutti i miei film, tuttavia, questo è un processo in corso, poiché devo identificare i livelli di qualità (Radarr, fortunatamente, etichetta quindi bene) e utilizzare una delle tre impostazioni di transcodifica:
-m slower -q 18 -x --no-sao --aq-mode 3
per le transcodifiche a 720p
-m medium -q 20 -x --no-sao --aq-mode 3
per 1080p
-m medium -q 22 -x --no-sao
per 2160p
Spero che questo aiuti alcune persone. Grida se qualcuno ha bisogno di un e prima di codificare tutto in x265, pensa alla riproduzione, se il client non supporta x265 nativo, la transcade può essere costosa in termini di CPU e qualità.
Commenti
- Con x265 2.4 e versioni successive (con le nuove tabelle lambda che forniscono codifiche più nitide), SAO di solito è una buona cosa per la qualità per bitrate. È ancora leggermente macchiato, ma riduce gli altri artefatti abbastanza da valerne la pena.
-
-q 20
non è CRF 20, è ‘ s controllo percentuale QP costante . La modalità predefinita e consigliata, CRF, aumenta il QP in alcune scene ad alta complessità, quindi ‘ non spende troppo molti bit in scene troppo difficili da codificare. (Se vuoi un QP più vicino a un QP uniforme, aumentaqcomp
dal valore predefinito 0.6 a forse 0.7 o 0.8. Un valore più vicino a 1.0 è più vicino al CQP.) - come gestisci le codifiche hdr / sdr quando non ‘ sai qual è la fonte?
Risposta
La sintassi corretta per abilitare la modalità lossless per il codificatore x265 in ffmpeg è -x265-params lossless=1
(è necessario aggiungere =1
).
Tuttavia, per la codifica senza perdite ci sono scelte di codec migliori. Ho scoperto testando che FFV1 si comprime molto meglio (dimensione del file = ~ 80% di x265) almeno su alcuni tipi di video (se vengono scelte le impostazioni migliori per entrambi codec). E funziona anche più velocemente e (AFAIK) non è gravato da brevetti. Cioè, è superiore allH.265 lossless in ogni modo per larchiviazione video. Il compromesso tuttavia è la compatibilità con il software e lhardware di riproduzione correnti.
--lossless
potrebbe infatti ingrandire il file, se decodifica il codec precedentemente con perdita di dati e poi codifica ciò che ha decodificato senza perdite. La qualità rimarrà esattamente la stessa dellinput.