Încerc să convertesc biblioteca mea video în format HEVC pentru a câștiga spațiu. Am executat următoarea comandă pe toate fișierele video din biblioteca mea:
#!/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
Acum, majoritatea videoclipurilor se convertesc bine, iar calitatea este aceeași ca înainte. Cu toate acestea, câteva videoclipuri de foarte bună calitate (de exemplu, un film de 5 GB) își pierd calitatea – videoclipul este pixelat.
Nu sunt sigur ce să fac în acest caz. Trebuie să modific parametrul crf
din linia mea de comandă? Sau altceva?
Lucrul este că fac o conversie în bloc. Deci, am nevoie de o metodă în care avconv
reglează automat orice parametru necesită ajustare, pentru fiecare videoclip.
UPDATE-1
Am constatat că crf
este butonul pe care trebuie să îl ajustez. CRF implicit este 28. Pentru o calitate mai bună, aș putea folosi ceva mai mic decât 28. De exemplu:
avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4
Cu toate acestea, problema este că pentru unele videoclipuri CRF valoarea de 28 este suficient de bună, în timp ce pentru unele videoclipuri este necesar un CRF mai mic. Acesta este un lucru pe care trebuie să îl verific manual convertind secțiuni mici din videoclipurile mari. Dar în conversia în bloc, cum aș verifica manual fiecare videoclip? Este un fel în care avconv
poate ajusta inteligent CRF în funcție de intrarea video?
UPDATE-2
Am constatat că există un --lossless
opțiune în x265: http://x265.readthedocs.org/en/default/lossless.html .
Cu toate acestea, nu știu cum să îl folosesc corect. Am încercat să îl folosesc în modul următor, dar a dat rezultate opuse (videoclipul a fost și mai pixelat):
avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
Comentarii
Răspuns
Din propria mea experiență, dacă nu doriți absolut nicio pierdere de calitate, –lossless este ceea ce căutați.
Nu sunt sigur despre avconv
, dar comanda pe care ați introdus-o pare identică cu ceea ce fac eu cu FFmpeg
. În FFmpeg
puteți trece parametrul astfel:
ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv
Cele mai multe x265
(opțiuni fără valoare) pot fi specificate astfel (cu excepția celor numai CLI, acestea sunt utilizate numai cu x265
binar direct).
Fără asta, aș vrea să împărtășesc experiența mea cu codificarea x265
. Pentru majoritatea videoclipurilor (fie WMV, MPEG sau AVC /H.264) Folosesc crf=23
. x265
decide restul parametrilor și de obicei face o treabă suficient de bună.
Cu toate acestea, de multe ori înainte de a mă angaja să transcodez un videoclip în întregime, îmi testez setările prin conversia unei porțiuni mici a videoclipului în cauză. Iată un exemplu, să presupunem că un fișier MKV cu fluxul 0 fiind video, fluxul 1 fiind audio DTS, iar fluxul 2 fiind un subtitlu:
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"
Rețineți că linia de semnal backslashes se întrerupe într-o comandă lungă, o fac pentru a mă ajuta să urmăresc a diferiților biți ai unei intrări CLI complexe. Înainte de a-l explica rând cu rând, partea în care convertiți doar o porțiune mică a unui videoclip este a doua linie și a doua ultimă linie: -ss 0
înseamnă căutare la 0 secundă înainte începe decodarea intrării și -t 120
înseamnă oprirea scrierii la ieșire după 120 de secunde. De asemenea, puteți utiliza formatele de timp hh: mm: ss sau hh: mm: ss.sss.
Acum rând cu rând:
-
-hide_banner
împiedicăFFmpeg
să afișeze informații de compilare la început. Nu vreau să-l văd când derulez în consolă; -
-ss 0
caută 0 secunde înainte de a începe decodarea intrării. Rețineți că dacă acest parametru i se dă după fișierul de intrare și înainte fișierul de ieșire, acesta devine o opțiune de ieșire și spuneffmpeg
pentru a decoda și ignora intrarea până la x secunde, apoi începeți să scrieți la ieșire. Ca opțiune de intrare este mai puțin precisă (deoarece căutarea nu este exactă în majoritatea formatelor containerelor), dar nu durează aproape nimic.Ca opțiune de ieșire, este foarte precisă, dar necesită o cantitate considerabilă de timp pentru a decoda tot fluxul înainte de ora specificată și, în scopul testării, nu doriți să pierdeți timpul; -
-i "INPUT.mkv"
: Specificați fișierul de intrare; -
-attach "COVER.jpg"
: atașați o copertă (imagine în miniatură, poster, orice) la ieșire. coperta este de obicei afișată în exploratorii de fișiere; -
-map_metadata 0
: copiați peste toate metadatele din intrarea 0, care în exemplu este doar intrarea; -
-map_chapters 0
: Copiați informațiile despre capitol (dacă există) din intrarea 0; -
-metadata title="TITLE"
: Setați titlul videoclipului; -
-map 0:0 ...
: Harta fluxului 0 al intrării 0, ceea ce înseamnă că dorim ca primul flux din intrare să fie scris în ieșire Deoarece acest flux este un flux video, acesta este primul flux video din ieșire , de unde și specificatorul fluxului:s:v:0
. Setați limba etichetați în limba engleză; -
-map 0:1 ...
: similar liniei 8, mapați al doilea flux (audio DTS) și setați limba și titlul acestuia (pentru o identificare mai ușoară atunci când alegeți de la jucători); -
-map 0:2 ...
: similar cu linia 9, cu excepția acestui flux este un subtitlu; -
-metadata:s:t:0 ...
: setați metadate pentru coperta. Acest lucru este necesar pentru formatul containerului mkv; -
-c:v libx265 ...
: opțiuni pentru codec video. Este atât de lung încât l-am împărțit în două rânduri. Această setare este bună pentru videoclipul bluray de înaltă calitate (1080p) cu bandare minimă în gradient (la care x265 este de rahat). Cel mai probabil este un exces pentru DVD-uri și emisiuni TV și videoclipuri pe telefon. Această setare este furată în mare parte din din această postare Doom9 ; -
crf=22:...
: Continuarea codecului video parametrii. Vedeți postarea de pe forum menționată mai sus; -
-c:a copy
: Copiați peste audio; -
-c:s copy
: Copiați subtitrări; -
-t 120
: Opriți scrierea pe ieșire după 120 de secunde, ceea ce ne oferă un clip de 2 minute pentru previzualizarea calității trancodării; -
"OUTPUT.HEVC.DTS.Sample.mkv"
: Numele fișierului de ieșire. Îmi etichetez numele fișierelor cu codecul video și codecul audio primar.
Whew. Acesta este primul meu răspuns, așa că, dacă am pierdut ceva, vă rugăm să lăsați un comentariu. Nu sunt un expert în producția de videoclipuri, sunt doar un tip prea leneș pentru a viziona un film punând discul în player.
PS. Poate că această întrebare aparține altundeva nu este strâns legat de Unix & Linux.
Comentarii
- Exact ceea ce căutam ! Acoperire frumoasă a opțiunilor. Știți dacă ffmpeg va fi considerat
c:s copy
dacă nu există conținut de subtitrare? - @ElderGeek Nu, ffmpeg va spune ceva numai dacă opțiunea respectivă are vreun efect.
- @TheBitByte Da și nu, cred. Nu ‘ nu doriți fișiere h265 fără pierderi. ‘ este doar un flux de biți brut, fără niciun fel de compresie. Este ‘ imens. Din ceea ce am înțeles despre implementarea h265 sau în mod specific x265, nu este o metodă de compresie fără pierderi. Orice grad de compresie va avea ca rezultat pierderea informațiilor, dar nu neapărat pierderea calității vizualizării. Dar ‘ nu sunt expert în subiecte h265, așa că este ‘ posibil să fi pierdut ceva
- @ TheBitByte nu ‘ nu cred că există un nivel de compresie fără pierderi în h265. Pentru opțiunea fără compresie, ‘ este doar
--lossless
. Am căutat în zadar o conversie fără pierderi de la h264 la h265 și ceea ce am aflat ‘ am aflat că ‘ este matematic imposibil. - Ar trebui să editați într-adevăr comanda care conține comutatorul
--lossless
din acest răspuns, deoarece așezați ca răspuns la această întrebare sună ca dvs. ‘ îl spune ‘ compresia fără pierderi, ceea ce este înșelător.
Răspuns
Am trecut recent de necazul Transcodificării întregului meu catalog video în HEVC. Folosesc https://github.com/FallingSnow/h265ize cu următoarele setări.
h265ize -v -m medium -q 20 -x –no-sao – -aq-mode 3 –delete –stats
-v – Verbose Output
-m medium – Medium viteza codificării (calitate mai mică mai mare, orice mi se pare mai lent nu merită timpul / calitatea dif)
-q 20 – CRF folosit, 20 este similar cu aproximativ 18 în x264, dar hei.Aceasta este pentru conținutul 1080p (90% din televizorul meu) tind să folosesc 22 pentru filmele mele 4K
-x – Utilizați comenzi definite central x265
–no-sao dezactivează Sample Adaptive Offset (îmbunătățește viteza codării)
–aq-mode 3 – utilizați cuantificarea adaptivă cu varianță automată, ajută la codificarea pe 8 biți, în special în zonele întunecate, oprește cea mai mare parte a bandării care se poate întâmpla (în detrimentul timpului de codare)
–delete – înlocuiți fișierul de codificare cu fișier codat (testați înainte de a-l utiliza)
–stats – Scrieți statistici într-un fișier CSV din rădăcină din calea pe care ați fugit.
Vitezele de codare sunt de aproximativ 30 fps (pentru majoritatea chestiunilor de 1080p) pe platforma mea. Dual Xeon E5 2687W v2, dar forțez procesul FFMPEG să nu folosească prima parte a unuia dintre procesoare (Este serverul meu Plex, așa că trebuie să vă asigurați că există o supracopie pentru transcodare, dacă este necesar la redare etc.)
Da, a durat ceva timp să convertesc cea mai mare parte a acestuia și acum am o sarcină programată care se execută de două ori pe zi pentru a codifica lucrurile din ziua respectivă până la x265.
Economisirea spațiului au fost enorme. SAN-ul meu inițial era la 20Tb, acum este în jur de 12, dar evident că a fost adăugat și cu încă 6 luni de conținut.
Am început să transcodez toate filmele mele, totuși, un proces continuu, deoarece trebuie să identific nivelurile de calitate (din fericire Radarr etichetează apoi frumos) și să folosesc una dintre cele trei setări de transcodare:
-m slower -q 18 -x --no-sao --aq-mode 3
pentru transcodurile de 720p
-m medium -q 20 -x --no-sao --aq-mode 3
pentru 1080p
-m medium -q 22 -x --no-sao
pentru 2160p
Sper că ajută unii oameni. Strigați dacă cineva are nevoie de un setarea manuală a totul. Și înainte de a codifica totul la x265, gândiți-vă la redare, dacă clientul nu acceptă nativitatea x265, transcada poate fi costisitoare în termeni de procesor și calitate.
Comentarii
- Cu x265 2.4 și versiuni ulterioare (cu noile tabele lambda care oferă coduri mai clare), SAO este de obicei un lucru bun pentru calitate pe bitrate. Încă mai este ușor, dar reduce alte artefacturi suficient pentru a merita.
-
-q 20
nu este CRF 20, ‘ s ratecontrol constant QP . Modul implicit și recomandat, CRF, ridică QP unele în scene de complexitate ridicată, astfel încât nu ‘ nu cheltuie prea mulți biți pe scene prea greu de realizat codifica. (Dacă doriți mai aproape de QP uniform, ridicațiqcomp
de la valoarea implicită 0.6 la 0.7 sau 0.8. Mai aproape de 1.0 este mai aproape de CQP.) - cum gestionați codurile hdr / sdr când nu ‘ nu știți care este sursa?
Răspundeți
Sintaxa corectă pentru a activa modul fără pierderi pentru codificatorul x265 în ffmpeg este -x265-params lossless=1
(trebuie să adăugați =1
).
Cu toate acestea, pentru codificarea fără pierderi există opțiuni mai bune de codec. Am constatat prin testare că FFV1 comprimă mult mai bine (dimensiunea fișierului = ~ 80% din x265) cel puțin pe unele tipuri de videoclipuri (dacă se aleg cele mai bune setări pentru ambele codecuri). Și, de asemenea, funcționează mai repede și (AFAIK) nu este împiedicat de brevete. Adică, este superior lui H.265 fără pierderi în toate modurile pentru arhivarea video. Cu toate acestea, compromisul este compatibilitatea cu software-ul și hardware-ul actual de redare.
--lossless
ar putea mări de fapt fișierul, dacă decodifică codecul cu pierderi anterior și apoi înconduce ceea ce a făcut decodează fără pierderi. Calitatea va rămâne exact la fel ca intrarea.