Video kütüphanesini kalite kaybı olmadan x265'te (HEVC) yeniden kodlama


43

Video kitaplığımı yer kazanmak için HEVC formatına dönüştürmeye çalışıyorum. Kütüphanemdeki tüm video dosyalarına aşağıdaki komutu koştum:

#!/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

Artık çoğu video para cezasına dönüşüyor ve kalite öncekiyle aynı. Bununla birlikte, çok yüksek kalitede olan birkaç video (örneğin 5 GB olan bir film baskısı) kaliteyi kaybeder - videonun tümü pikselleşir.

Bu durumda ne yapacağımdan emin değilim. crfKomut satırımdaki parametreyi değiştirmem gerekir mi? Veya başka bir şey?

Mesele şu ki, toplu dönüştürme yapıyorum. Bu nedenle, avconvher video için hangi parametrenin ayarlanması gerektiğini otomatik olarak ayarlayan bir yönteme ihtiyacım var.

GÜNCELLEME-1

Bunu buldum crfben ayarlamak gerekir topuzu olduğunu. Varsayılan CRF 28'dir. Daha iyi kalite için 28'den küçük bir şey kullanabilirim. Örneğin:

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

Ancak sorun, bazı videolarda CRF'nin 28 değerinin yeterince iyi olması, bazı videolarda ise daha düşük CRF'nin gerekli olmasıdır. Bu, büyük videoların küçük bölümlerini dönüştürerek manuel olarak kontrol etmem gereken bir şey. Ancak toplu dönüştürme işleminde her bir videoyu manuel olarak nasıl kontrol ederim? avconvGiriş videolarına göre CRF’yi akıllıca ayarlayabilecekleri bir yöntem midir?

GÜNCELLEME-2

--losslessX265'te bir seçenek olduğunu buldum: http://x265.readthedocs.org/en/default/lossless.html .

Ancak, nasıl doğru kullanılacağını bilmiyorum. Aşağıdaki şekilde kullanmaya çalıştım ancak karşıt sonuçlar verdi (video daha da pikselliydi):

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

1
--losslessAslında, daha önce kaybedilen kod çözücünün kodunu çözerse ve daha sonra kayıpsız bir şekilde kodunu çözdüğü takdirde, dosyayı büyütebilir. Kalite, girdi ile tamamen aynı kalacaktır.
Golar Ramblar

2
Kaynaklarınız kayıp kodluysa (büyük olasılıkla), o zaman elde etmeye çalıştığınız şey mümkün değildir. Kayıpsız olmayan herhangi bir kodlama kaliteyi daha da düşürecektir (hemen görülemeseniz bile) ve kayıpsızdan kayıpsız hale dönüştürürseniz, daha büyük dosya boyutları elde edersiniz.
Sarge Borsch,

Yanıtlar:


58

Kendi tecrübelerime göre, kesinlikle kalite kaybına uğramak istemiyorsanız, - aradığınız şey - parlaklık değildir.

Emin değilim avconvama yazdığınız komut, yaptığım işle aynı görünüyor FFmpeg. İçindeki FFmpegparametreyi şunun gibi geçebilir:

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

Çoğu x265anahtar (değeri olmayan seçenekler) bu şekilde belirtilebilir (yalnızca CLI olanlar hariç, bunlar yalnızca x265doğrudan ikili ile kullanılır ).

Bunun dışında, tecrübelerimi x265kodlama ile paylaşmak istiyorum . Çoğu video için (WMV veya MPEG veya AVC / H.264 olabilir) kullanıyorum crf=23. x265Parametrelerin geri kalanına karar verir ve genellikle yeterince iyi bir iş çıkarır.

Ancak çoğu zaman bir videonun tamamını kod dönüştürmeden önce, ayarlarımı söz konusu videonun küçük bir bölümünü dönüştürerek test ederim. Örnek olarak, akış 0'ın video, akış 1'in DTS sesi ve akış 2'nin bir altyazı olduğu bir mkv dosyası olduğunu varsayalım:

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"

Ters eğik çizgi sinyal hattının uzun bir komutta kesildiğini, karmaşık bir CLI girişinin çeşitli parçalarını izlememe yardımcı olmak için yapıyorum. Satır satır açıklamadan önce, videonun yalnızca küçük bir bölümünü dönüştürdüğünüz kısım ikinci satır ve ikinci son satırdır: -ss 0girişin kodunu çözmeye başlamadan önce 0 saniye aramayı -t 120ve çıktıya yazmaya son vermeyi ifade eder 120 saniye sonra. Ayrıca ss: dd: ss veya ss: dd: ss.sss zaman biçimlerini de kullanabilirsiniz.

Şimdi satır satır:

  1. -hide_bannerFFmpegBaşlangıçta derleme bilgileri gösterilmesini engeller . Sadece konsola girdiğimde görmek istemiyorum;
  2. -ss 0girişin kodunu çözmeye başlamadan önce 0 saniye bekler. Eğer bu parametre giriş dosyasından sonra ve çıkış dosyasından önce verilirse , bunun bir çıkış seçeneği haline geldiğini ffmpegve girdiyi x saniyeye kadar çözmeyi ve yok saymayı ve ardından çıktıya yazmaya başladığını söyleyin . Bir giriş seçeneği olarak daha az doğrudur (çünkü çoğu konteyner biçiminde arama yapmak doğru değildir), ancak neredeyse hiç zaman almaz. Bir çıkış seçeneği olarak, kesindir ancak belirtilen zamandan önce tüm akışın kodunu çözmek için önemli miktarda zaman alır ve test amacıyla zaman kaybetmek istemezsiniz;
  3. -i "INPUT.mkv": Giriş dosyasını belirtin;
  4. -attach "COVER.jpg": Çıktıya bir kapak resmi (küçük resim, poster, her neyse) ekleyin. Kapak resmi genellikle dosya araştırıcılarda gösterilir;
  5. -map_metadata 0: 0 numaralı girişteki tüm meta verilerin üzerine kopyalayın; bu örnekte sadece giriş olan;
  6. -map_chapters 0: (Varsa) bölüm bilgisini 0 girişinden kopyalayın;
  7. -metadata title="TITLE": Videonun başlığını ayarlayın;
  8. -map 0:0 ...: Girdi 0'daki harita akışı 0, yani girişten ilk akışın çıktıya yazılmasını istediğimiz anlamına gelir. Bu akış bir video akışı olduğundan , çıkıştaki ilk video akışıdır , bu nedenle akış belirticisidir . Dil etiketini İngilizce'ye ayarlayın;:s:v:0
  9. -map 0:1 ...: Satır 8'e benzer şekilde, ikinci akışı (DTS sesi) eşleyin ve dilini ve başlığını ayarlayın (oyunculardan seçim yaparken daha kolay tanımlama için);
  10. -map 0:2 ...: Satır 9'a benzer, ancak bu akış bir altyazı değildir;
  11. -metadata:s:t:0 ...: Kapak resmi için meta verileri ayarlayın. Bu, mkv container formatı için gereklidir;
  12. -c:v libx265 ...: Video codec seçenekleri. O kadar uzun ki, iki çizgiye böldüm. Bu ayar, gradyanda (x265'in berbat olduğu) minimum bantlama ile yüksek kaliteli bluray video (1080p) için iyidir. Büyük olasılıkla DVD'ler, TV şovları ve telefon videoları için fazladan bir engeldir. Bu ayar çoğunlukla bu Doom9 postasından çalınır ;
  13. crf=22:...: Video codec parametrelerinin devamı. Yukarıda belirtilen forum gönderisine bakın;
  14. -c:a copy: Ses üzerinden kopyala;
  15. -c:s copy: Altyazıları kopyala;
  16. -t 120: Çıktıya yazmayı 120 saniye sonra durdurun; bu, kayıt kodlama kalitesini önizlemede bize 2 dakikalık bir klip verir;
  17. "OUTPUT.HEVC.DTS.Sample.mkv": Çıktı dosya adı. Dosya adlarımı video codec bileşeni ve birincil ses codec bileşeni ile etiketlerim.

Whew. Bu benim ilk cevabım, bu yüzden eğer kaçırdığım bir şey varsa, bir yorum bırakın lütfen. Ben bir video prodüksiyon uzmanı değilim, sadece diski oynatıcıya yerleştirerek film izleyemeyecek kadar tembel bir adamım.

PS. Belki de bu soru, Unix ve Linux ile yakından ilişkili olmadığı için başka bir yere aittir.


2
Tam olarak aradığım şey! Seçeneklerin hoş kapsamı. c:s copyAltyazı içeriği yoksa ffmpeg'in yavaşlayacağını biliyor musunuz ?
Elder Geek,

1
@ElderGeek Hayır, ffmpeg sadece bu seçeneğin bir etkisi varsa bir şey söyleyecektir.
Yifeng Mu

Bu seçenek gerçekten kayıpsız h265 kodlaması için mümkün olan en küçük dosya boyutunu oluşturuyor mu? Olmazsa, bunu yapmamın bir yolu var mı?
Tampon Aşırı Okuma

1
@TheBitByte h265'te kayıpsız bir sıkıştırma seviyesi olduğunu sanmıyorum. Sıkıştırmasız seçenek için sadece --lossless. H264'ten h265'e kayıpsız bir dönüşüm için boşuna aradım ve öğrendiklerim matematiksel olarak imkansız olduğunu söyledi.
Yifeng Mu,

1
--losslessBu cevabın anahtarını içeren komutu gerçekten düzenlemelisiniz , çünkü bu sorunun cevabı olarak yanıltıcı olan kayıpsız bir sıkıştırma olduğunu söylüyorsunuz.
Hashim

8

Kısa bir süre önce tüm video kataloğumun HEVC'ye çevrilmesi sorununu yaşadım. Aşağıdaki ayarlarla https://github.com/FallingSnow/h265ize adresini kullanıyorum .

h265ize -v -m orta -q 20 -x - no-sao - aq modu 3 - kırmızı - üst

-v - Ayrıntılı Çıktı
-m orta - Orta kodlama hızı (daha küçük daha yüksek kalite, daha yavaş bulduğum herhangi bir şey zaman / kalite değerine değmez)
-q 20 - kullanılan CRF, 20 x264'te 18'e benzer, ancak hey. Bu, 1080p içerik içindir (TV’nin% 90’ı) 4K filmlerim için 22 kullanma eğilimindeyim
-x - x265 merkezi tanımlı komutları kullan -
no-sao Örnek Adaptif Ofset'i kapatır (kodlamanın hızını artırır) -
aq modu 3 - otomatik varyansa sahip Uyarlamalı Miktar Tayini'ni kullanın, özellikle karanlık alanlarda 8 bit kodlamalara yardımcı olur, olabilecek bantlamanın çoğunu durdurur (kodlama zamanı olsa pahasına) -
silme - kodlama dosyasını kodlanmış dosya ile değiştir (bunu kullanmadan önce test et) ) -
puanlar - İstatistikleri, koştuğunuz yolun kökündeki bir csv dosyasına yazın.

Kodlama hızları, donanımımda 30 fps civarında (çoğu 1080p için). Dual Xeon E5 2687W v2, ancak FFMPEG işlemini işlemcilerden birinin ilk tarafını kullanmaya zorlamıyorum (Bu benim Plex sunucumdur, bu nedenle oynatmada gerektiğinde kod geçişi için gerekli olduğundan emin olun)

Evet, çoğunu dönüştürmek biraz zaman aldı ve şimdi o günden x265'e kadar olan şeyleri kodlamak için günde iki kez çalışan zamanlanmış bir görevim var.

Yer tasarrufu muazzam olmuştur. İlk SAN'ım 20 TB kullanımdaydı, şimdi 12 civarındaydı ama açıkçası 6 ay daha fazla içerik eklenmiş.

Tüm Filmlerimi de dönüştürmeye başladım, ancak bu, devam eden bir işlemdi, çünkü kalite seviyelerini (Radarr neyse iyi etiketler sonra güzel etiketler) ve üç transcode ayarından birini kullanmalıyım:

-m slower -q 18 -x --no-sao --aq-mode 3720p kodları
-m medium -q 20 -x --no-sao --aq-mode 3için 1080p
-m medium -q 22 -x --no-saoiçin 2160p için

Bazı insanlara yardımcı olacağını umuyorum. Birinin hepsini ayarlamak için bir ele ihtiyacı olursa bağır. Ve her şeyi x265 olarak kodlamadan önce, oynatmayı düşünün, müşteri x265 native özelliğini desteklemiyorsa, geçiş işlemi CPU ve Kalite açısından pahalı olabilir.


İle (yeni lambda tablolar daha sonra X265 2.4 ve Sao genellikle bit başına kalitesi için iyi bir şeydir vermek keskin kodlar). Hala hafifçe parlıyor, fakat buna değer olacak kadar diğer eserleri de azaltıyor.
Peter Cordes

-q 20CRF 20 değil, sabit QP hız kontrolü . Varsayılan ve önerilen mod olan CRF, yüksek karmaşıklıktaki sahnelerde QP'yi yükseltir, böylece kodlaması zor olan sahnelerde çok fazla bit harcamaz . (Üniforma QP'ye daha yakın olmak istiyorsanız qcomp, varsayılan 0.6'dan belki 0.7 veya 0.8'e yükseltin. 1.0'a yakın, CQP'ye daha yakın.)
Peter Cordes

3

Ffmpeg'deki x265 enkoder için kayıpsız modu etkinleştirmek için doğru sözdizimi şudur -x265-params lossless=1(eklemeniz gerekir =1).

Ancak, kayıpsız kodlama için daha iyi kodek seçenekleri vardır. O test ederek tespit FFV1 (en iyi ayarları her iki codec için seçilir ise) videonun bazı türlü en azından büyük ölçüde daha iyi (dosya boyutu X265 içinde = ~% 80) sıkıştırır. Ayrıca daha hızlı çalışır ve (AFAIK) patentlerle korunmaz. Yani, video arşivlemede her yönden kayıpsız H.265'ten üstündür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.