Jeg forsøger at konvertere mit videobibliotek til HEVC-format for at få plads. Jeg kørte følgende kommando på alle videofilerne i mit bibliotek:
#!/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
Nu konverterer de fleste videoer fint, og kvaliteten er den samme som før. Et par videoer, der er af meget høj kvalitet (f.eks. Et filmprint på 5 GB) mister imidlertid kvaliteten – videoen er alle pixeleret.
Jeg er ikke sikker på, hvad jeg skal gøre i dette tilfælde. Skal jeg ændre parameteren crf
på min kommandolinje? Eller noget andet?
Sagen er, at jeg laver en bulkkonvertering. Så jeg har brug for en metode, hvor avconv
automatisk justerer den parameter, der skal justeres, for hver video.
UPDATE-1
Jeg fandt ud af, at crf
er den knap, jeg skal justere. Standard CRF er 28. For bedre kvalitet kunne jeg bruge noget mindre end 28. For eksempel:
avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4
Problemet er dog, at CRF for nogle videoer værdien 28 er god nok, mens der for nogle videoer kræves lavere CRF. Dette er noget, som jeg skal kontrollere manuelt ved at konvertere små sektioner af de store videoer. Men ved bulkkonvertering, hvordan kontrollerer jeg hver video manuelt? Er deres måde, at avconv
kan justere CRF i overensstemmelse med inputvideoen intelligent?
UPDATE-2
Jeg fandt ud af, at der er en --lossless
mulighed i x265: http://x265.readthedocs.org/en/default/lossless.html .
Dog ved jeg ikke, hvordan jeg bruger det korrekt. Jeg prøvede at bruge det på følgende måde, men det gav modsatte resultater (videoen var endnu mere pixeleret):
avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
Kommentarer
Svar
Fra min egen erfaring, hvis du absolut ikke ønsker noget tab af kvalitet – hvad du leder efter.
Ikke sikker på avconv
men den kommando, du skrev, ser identisk ud med hvad jeg gør med FFmpeg
. I FFmpeg
kan du videregive parameteren sådan:
ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv
Mest x265
switche (optioner uden værdi) kan specificeres på denne måde (undtagen de kun CLI, de bruges kun med x265
binært direkte).
Med det ude af vejen vil jeg gerne dele min oplevelse med x265
-kodning. For de fleste videoer (det være sig WMV eller MPEG eller AVC /H.264) Jeg bruger crf=23
. x265
bestemmer resten af parametrene og normalt gør det et godt nok job.
Men ofte inden jeg forpligter mig til at kode en video i sin helhed, tester jeg mine indstillinger ved at konvertere en lille del af den pågældende video. Her er et eksempel, antag at en mkv-fil med stream 0 er video, stream 1 at være DTS-lyd, og stream 2 være en undertekst:
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"
Bemærk, at backslash-signallinjens brud i en lang kommando gør jeg for at hjælpe mig med at holde styr af forskellige bits i en kompleks CLI-indgang. Før jeg forklarer det linje for linje, er den del, hvor du kun konverterer en lille del af en video, den anden linje og den næstsidste linje: -ss 0
betyder søge til 0 sekund før begynder at afkode indgangen, og -t 120
betyder at stoppe skrivningen til udgangen efter 120 sekunder. Du kan også bruge hh: mm: ss eller hh: mm: ss.sss tidsformater.
Nu linje for linje:
-
-hide_banner
forhindrerFFmpeg
i at vise buildoplysninger ved start. Jeg vil bare ikke “se det, når jeg ruller op i konsollen; -
-ss 0
søger 0 sekunder inden start af afkodning af input. Bemærk, at hvis denne parameter gives efter inputfilen og før outputfilen, bliver den en outputmulighed og fortællerffmpeg
for at afkode og ignorere input indtil x sekunder, og start derefter med at skrive til output. Som inputmulighed er det mindre nøjagtigt (fordi søgning ikke er nøjagtig i de fleste containerformater), men det tager næsten ingen tid.Som outputmulighed er det meget præcist, men det tager lang tid at afkode hele strømmen inden den angivne tid, og til testformål vil du ikke spilde tid; -
-i "INPUT.mkv"
: Angiv inputfilen; -
-attach "COVER.jpg"
: Vedhæft en omslagsgrafik (miniaturebillede, plakat, hvad som helst) til output. omslagskunst vises normalt i filopdagelsesrejsende; -
-map_metadata 0
: Kopier over alle metadata fra input 0, som i eksemplet kun er input; -
-map_chapters 0
: Kopier over kapiteloplysninger (hvis de findes) fra input 0; -
-metadata title="TITLE"
: Indstil titlen på videoen; -
-map 0:0 ...
: Kortstrøm 0 til input 0, hvilket betyder, at vi vil have, at den første stream fra input skal skrives til output Da denne stream er en videostream, er den den første video stream i output , hvorfor stream-specifikationen:s:v:0
. Indstil sprog tag til engelsk; -
-map 0:1 ...
: Svarende til linje 8, kortlæg den anden stream (DTS-lyd) og indstil dens sprog og titel (for lettere identifikation, når du vælger fra spillere); -
-map 0:2 ...
: Svarende til linje 9, bortset fra at denne stream er en undertekst; -
-metadata:s:t:0 ...
: Indstil metadata til omslagskunst. Dette er nødvendigt for formatet mkv-container; -
-c:v libx265 ...
: Video codec-indstillinger. Det er så længe, at jeg har brudt det i to linjer. Denne indstilling er god til bluray-video i høj kvalitet (1080p) med minimal bånd i gradient (som x265 suger af). Det er højst sandsynligt en overkill til DVDer og tv-shows og telefonvideoer. Denne indstilling er for det meste stjålet fra dette Doom9-indlæg ; -
crf=22:...
: Fortsættelse af videokodec parametre. Se forumindlægget nævnt ovenfor; -
-c:a copy
: Kopier over lyd; -
-c:s copy
: Kopier undertekster; -
-t 120
: Stop med at skrive til output efter 120 sekunder, hvilket giver os et 2-minutters klip til forhåndsvisning af trancoding-kvalitet; -
"OUTPUT.HEVC.DTS.Sample.mkv"
: Outputfilnavn. Jeg mærker mine filnavne med videokodec og den primære lydkodec.
Whew. Dette er mit første svar, så hvis der er noget, jeg savnede, skal du efterlade en kommentar. Jeg er ikke en videoproduktionsekspert, jeg er bare en fyr, der er for doven til at se en film ved at sætte disken i afspilleren.
PS. Måske hører dette spørgsmål til et andet sted, som det er ikke stærkt relateret til Unix & Linux.
Kommentarer
- Præcis hvad jeg ledte efter ! Dejlig dækning af muligheder. Ved du, om ffmpeg vil balkere ved
c:s copy
, hvis der ikke er noget undertekstindhold? - @ElderGeek Nej, ffmpeg vil kun sige noget, hvis denne mulighed har nogen effekt.
- @TheBitByte Ja og nej, tror jeg. Du vil ikke ‘ ikke have tabsfri h265-filer. Det ‘ er bare rå bitstrøm uden nogen form for komprimering. Det ‘ er enormt. Fra hvad jeg forstår ved implementering af h265 eller specifikt x265, er det ikke en tabsfri komprimeringsmetode. Enhver grad af komprimering vil medføre tab af information, men ikke nødvendigvis tab af visningskvalitet. Men jeg ‘ er ikke ekspert på h265-emner, så det er ‘ muligt, at jeg savnede noget
- @ TheBitByte Jeg tror ikke ‘ der er et tabsfrit komprimeringsniveau i h265. For komprimeringsløs indstilling er det ‘ bare
--lossless
. Jeg søgte forgæves efter en tabsfri konvertering fra h264 til h265, og hvad jeg ‘ har lært, fortæller mig, at det ‘ er matematisk umuligt. - Du skal virkelig redigere kommandoen indeholdende
--lossless
skifte fra dette svar, fordi placeres der som et svar på dette spørgsmål lyder det som dig ‘ siger det ‘ s tabsfri kompression, hvilket er vildledende.
Svar
Jeg er for nylig gået igennem besværet med at konvertere hele mit videokatalog til HEVC. Jeg bruger https://github.com/FallingSnow/h265ize med følgende indstillinger.
h265ize -v -m medium -q 20 -x –no-sao – -aq-mode 3 –delete –statistik
-v – Udtalt output
-m medium – Medium kodehastighed (mindre højere kvalitet, noget langsommere finder jeg ikke værd at tiden / kvaliteten er anderledes)
-q 20 – den anvendte CRF, 20 svarer til 18 eller deromkring i x264, men hej.Dette er til 1080p-indhold (90% af mit tv). Jeg plejer at bruge 22 til mine 4K-film
-x – Brug x265-definerede kommandoer
–no-sao slukker for prøveadaptiv forskydning (forbedrer kodningens hastighed)
–aq-mode 3 – brug adaptiv kvantificering med automatisk varians, hjælper 8bit-koder, især i mørke områder, stopper det meste af båndet, der kan ske (på bekostning af kodetiden dog)
–delete – udskift kodningsfil med kodet fil (test før du bruger denne)
–statistik – Skriv statistik til en csv-fil i roden af den sti, du løb fra.
Kodehastigheder er omkring 30 fps (for de fleste 1080p-ting) på min rig. Dual Xeon E5 2687W v2, men jeg tvinger FFMPEG-processen til ikke at bruge den første side af en af processorer (det er min Plex-server, så sørg for, at der er overhead til transkode, hvis det er nødvendigt ved afspilning osv.)
Ja det tog et stykke tid at konvertere det meste af det, og nu har jeg en planlagt opgave, der kører to gange om dagen for at kode tingene fra den dag til x265.
Pladsbesparelsen har været enorme. Min oprindelige SAN var ved brug af 20 TB, nu er den omkring 12, men er naturligvis også tilføjet med 6 måneders mere indhold.
Jeg er også begyndt at kode alle mine film over, men det er en løbende proces, da jeg skal identificere kvalitetsniveauer (Radarr mærker heldigvis pænt) og bruge en af tre transkodeindstillinger:
-m slower -q 18 -x --no-sao --aq-mode 3
til 720p transkoder
-m medium -q 20 -x --no-sao --aq-mode 3
til 1080p
-m medium -q 22 -x --no-sao
i 2160p
Håber det hjælper nogle mennesker. råb hvis nogen har brug for en hånd sætte det hele op. Og inden du koder alt til x265, så tænk på afspilning, hvis klienten ikke understøtter x265 native, så kan transcaden være dyr med hensyn til CPU og kvalitet.
Kommentarer
- Med x265 2.4 og senere (med de nye lambda-tabeller , der giver skarpere koder), er SAO normalt en god ting for kvalitet pr. bithastighed. Det smører stadig lidt, men reducerer andre artefakter nok til at være det værd.
-
-q 20
er ikke CRF 20, det ‘ s konstant QP ratkontrol . Standard- og anbefalet tilstand, CRF, hæver QP nogle i scener med høj kompleksitet, så det ikke ‘ t bruger for mange bits på scener, der er for svære at kode. (Hvis du vil have tættere på ensartet QP, hævqcomp
op fra standard 0,6 til måske 0,7 eller 0,8. Tættere på 1,0 er tættere på CQP.) - hvordan håndterer du hdr / sdr-koder, når du ikke ‘ ikke ved, hvad kilden er?
Svar
Den korrekte syntaks for at aktivere tabsfri tilstand for x265-koderen i ffmpeg er -x265-params lossless=1
(du skal tilføje =1
).
For tabsfri kodning er der dog bedre codec-valg. Jeg fandt ved at teste, at FFV1 komprimerer langt bedre (filstørrelse = ~ 80% af x265) i det mindste på nogle former for video (hvis de bedste indstillinger vælges for begge codecs). Og det fungerer også hurtigere, og (AFAIK) er ikke belastet med patenter. Det vil sige, det er bedre end tabsfri H.265 på alle måder til videoarkivering. Kompromiset er dog kompatibilitet med den aktuelle afspilningssoftware og hardware.
--lossless
kan faktisk forstørre filen, hvis den afkoder den tidligere tabte codec og derefter indkoder, hvad den dekodede tabsfrit. Kvalitet forbliver nøjagtig den samme som input.