Mengkode ulang pustaka video dalam x265 (HEVC) tanpa kehilangan kualitas

43

Saya mencoba mengonversi pustaka video saya ke format HEVC untuk mendapatkan ruang. Saya menjalankan perintah berikut di semua file video di perpustakaan saya:

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

Sekarang, sebagian besar video dikonversi dengan baik dan kualitasnya sama seperti sebelumnya. Namun, beberapa video dengan kualitas sangat tinggi (mis. Satu cetakan film yang 5GB) kehilangan kualitas - video semuanya pixelated.

Saya tidak yakin apa yang harus dilakukan dalam kasus ini. Apakah saya perlu mengubah crfparameter di baris perintah saya? Atau sesuatu yang lain?

Masalahnya, saya melakukan konversi massal. Jadi, saya memerlukan metode di mana avconvsecara otomatis menyesuaikan parameter apa pun yang perlu penyesuaian, untuk setiap video.

UPDATE-1

Saya menemukan itu crfadalah tombol yang harus saya sesuaikan. CRF default adalah 28. Untuk kualitas yang lebih baik, saya bisa menggunakan sesuatu yang kurang dari 28. Misalnya:

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

Namun, masalahnya adalah bahwa untuk beberapa video, nilai CRF 28 cukup baik, sedangkan untuk beberapa video, CRF yang lebih rendah diperlukan. Ini adalah sesuatu yang harus saya periksa secara manual dengan mengonversi bagian kecil dari video besar. Tetapi dalam konversi massal, bagaimana saya memeriksa setiap video secara manual? Apakah cara mereka yang avconvdapat menyesuaikan CRF sesuai dengan video input cerdas?

UPDATE-2

Saya menemukan bahwa ada --losslessopsi di x265: http://x265.readthedocs.org/en/default/lossless.html .

Namun, saya tidak tahu bagaimana menggunakannya dengan benar. Saya mencoba menggunakannya dengan cara berikut tetapi menghasilkan hasil yang berlawanan (video itu bahkan lebih pixelated):

avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
shivams
sumber
1
--losslessmungkin sebenarnya memperbesar file, jika ia menerjemahkan codec yang sebelumnya lossy dan kemudian mengkodekan apa yang ia decode lossless. Kualitas akan tetap sama persis dengan input.
Golar Ramblar
2
Jika sumber Anda dikodekan dalam lossy (yang kemungkinan besar), maka apa yang Anda coba capai adalah mustahil. Setiap transcoding yang tidak lossless akan menurunkan kualitas lebih lanjut (bahkan jika tidak segera terlihat oleh Anda) dan jika Anda mengkonversi dari lossy ke lossless, Anda akan mendapatkan ukuran file yang lebih besar.
Sarge Borsch

Jawaban:

58

Dari pengalaman saya sendiri, jika Anda benar-benar tidak ingin kehilangan kualitas, --losless adalah apa yang Anda cari.

Tidak yakin tentang avconvtetapi perintah yang Anda ketik terlihat identik dengan apa yang saya lakukan FFmpeg. Di FFmpegAnda dapat melewati parameter seperti ini:

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

Sebagian besar x265sakelar (opsi tanpa nilai) dapat ditentukan seperti ini (kecuali yang hanya CLI, yang hanya digunakan dengan x265biner secara langsung).

Dengan itu, saya ingin berbagi pengalaman saya dengan x265pengkodean. Untuk sebagian besar video (baik itu WMV, atau MPEG, atau AVC / H.264) saya gunakan crf=23. x265memutuskan sisa parameter dan biasanya itu melakukan pekerjaan yang cukup baik.

Namun sering sebelum saya berkomitmen untuk transcoding video secara keseluruhan, saya menguji pengaturan saya dengan mengubah sebagian kecil dari video tersebut. Berikut ini sebuah contoh, misalkan file mkv dengan stream 0 menjadi video, streaming 1 menjadi audio DTS, dan streaming 2 menjadi subtitle:

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"

Perhatikan bahwa garis sinyal backslash terputus dalam sebuah perintah yang panjang, saya melakukannya untuk membantu saya melacak berbagai bit dari input CLI yang kompleks. Sebelum saya menjelaskannya baris demi baris, bagian di mana Anda hanya mengkonversi sebagian kecil dari video adalah baris kedua dan baris terakhir kedua: -ss 0berarti mencari 0 detik sebelum mulai mendekode input, dan -t 120berarti berhenti menulis ke output setelah 120 detik. Anda juga dapat menggunakan format waktu jj: mm: dd atau jj: mm: dd.sss.

Sekarang baris demi baris:

  1. -hide_bannermencegah FFmpegmenampilkan informasi bangunan saat mulai. Saya hanya tidak ingin melihatnya ketika saya menggulir ke atas di konsol;
  2. -ss 0cari 0 detik sebelum mulai mendekode input. Perhatikan bahwa jika parameter ini diberikan setelah file input dan sebelum file output, itu menjadi opsi output dan memberitahu ffmpeguntuk mendekode dan mengabaikan input sampai x detik, dan kemudian mulai menulis ke output. Sebagai opsi input, ini kurang akurat (karena pencarian tidak akurat dalam kebanyakan format wadah), tetapi hampir tidak memerlukan waktu. Sebagai opsi keluaran, ini sangat tepat tetapi membutuhkan banyak waktu untuk memecahkan kode semua aliran sebelum waktu yang ditentukan, dan untuk tujuan pengujian Anda tidak ingin membuang waktu;
  3. -i "INPUT.mkv": Tentukan file input;
  4. -attach "COVER.jpg": Pasang seni sampul (gambar mini, poster, apa pun) ke output. Seni sampul biasanya ditampilkan di penjelajah file;
  5. -map_metadata 0: Salin atas semua dan semua metadata dari input 0, yang dalam contoh ini hanyalah input;
  6. -map_chapters 0: Menyalin info bab (jika ada) dari input 0;
  7. -metadata title="TITLE": Tetapkan judul video;
  8. -map 0:0 ...: Peta aliran 0 dari input 0, yang berarti kita ingin aliran pertama dari input ditulis ke output. Karena aliran ini adalah aliran video, itu adalah aliran video pertama dalam output , karenanya penentu aliran :s:v:0. Tetapkan tag bahasanya ke Bahasa Inggris;
  9. -map 0:1 ...: Mirip dengan baris 8, petakan streaming kedua (audio DTS), dan atur bahasa dan judulnya (untuk memudahkan identifikasi saat memilih dari pemain);
  10. -map 0:2 ...: Mirip dengan baris 9, kecuali aliran ini adalah subtitle;
  11. -metadata:s:t:0 ...: Atur metadata untuk sampul depan. Ini diperlukan untuk format wadah mkv;
  12. -c:v libx265 ...: Opsi codec video. Sudah begitu lama sehingga saya memecahnya menjadi dua baris. Pengaturan ini baik untuk video bluray berkualitas tinggi (1080p) dengan gradasi minimum gradien (yang x265 sucks at). Kemungkinan besar adalah pembunuhan berlebihan untuk DVD dan acara TV dan video ponsel. Pengaturan ini sebagian besar dicuri dari posting Doom9 ini ;
  13. crf=22:...: Kelanjutan parameter codec video. Lihat posting forum yang disebutkan di atas;
  14. -c:a copy: Menyalin audio;
  15. -c:s copy: Salin teks terjemahan;
  16. -t 120: Berhenti menulis ke output setelah 120 detik, yang memberi kita klip 2 menit untuk melihat pratinjau kualitas trancoding;
  17. "OUTPUT.HEVC.DTS.Sample.mkv": Output nama file. Saya menandai nama file saya dengan codec video dan codec audio utama.

Wah. Ini adalah jawaban pertama saya jadi jika ada sesuatu yang saya lewatkan silakan tinggalkan komentar. Saya bukan ahli produksi video, saya hanya seorang lelaki yang terlalu malas untuk menonton film dengan memasukkan disk ke dalam pemutar.

PS. Mungkin pertanyaan ini milik orang lain karena tidak terkait erat dengan Unix & Linux.

Yifeng Mu
sumber
2
Persis apa yang saya cari! Cakupan opsi yang bagus. Apakah Anda tahu jika ffmpeg akan menolak c:s copyjika tidak ada konten subtitle?
Penatua Geek
1
@ElderGeek Tidak, ffmpeg hanya akan mengatakan sesuatu jika opsi itu berpengaruh.
Yifeng Mu
Apakah opsi ini menghasilkan ukuran file sekecil mungkin untuk pengkodean h265 yang benar-benar tanpa kehilangan? Jika tidak, apakah ada cara saya bisa melakukan ini?
Buffer Over Read
1
@ TheBitByte Saya tidak berpikir ada tingkat kompresi lossless di H265. Untuk opsi tanpa kompresi, hanya saja --lossless. Saya sia-sia mencari konversi lossless dari h264 ke h265, dan apa yang saya pelajari mengatakan bahwa secara matematis tidak mungkin.
Yifeng Mu
1
Anda harus benar-benar mengedit perintah yang berisi --losslessperalihan dari jawaban ini, karena menempatkan di sana sebagai jawaban untuk pertanyaan ini sepertinya Anda mengatakan itu kompresi lossless, yang menyesatkan.
Hashim
8

Saya baru-baru ini mengalami kesulitan Transcoding seluruh katalog video saya ke HEVC. Saya menggunakan https://github.com/FallingSnow/h265ize dengan pengaturan berikut.

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

-v - Output Verbose
-m medium - Kecepatan encode sedang (kualitas lebih tinggi lebih kecil, apa pun lebih lambat saya temukan tidak sebanding dengan waktu / kualitas dif)
-q 20 - CRF yang digunakan, 20 mirip dengan 18 atau lebih di x264 tapi hei. Ini untuk konten 1080p (90% dari TV saya) Saya cenderung menggunakan 22 untuk film 4K saya
-x - Menggunakan x265 perintah pusat yang ditentukan
--no-sao mematikan Sample Adaptive Offset (meningkatkan kecepatan penyandian)
--aq-mode 3 - gunakan Adaptive Quantisation dengan auto variance, membantu penyandian 8bit, terutama di daerah gelap, menghentikan sebagian besar penambatan yang dapat terjadi (dengan mengorbankan waktu penyandian) -
menghapus - mengganti file penyandian dengan file yang disandikan (uji sebelum menggunakan yang ini )
--stats - Tulis statistik ke file csv di root dari path tempat Anda berlari.

Kecepatan encode sekitar 30fps (untuk sebagian besar 1080p stuff) di rig saya. Dual Xeon E5 2687W v2, tapi saya memaksa proses FFMPEG untuk tidak menggunakan sisi pertama dari salah satu prosesor (Ini adalah server Plex saya, jadi harus memastikan ada overhead untuk transcode jika diperlukan pada pemutaran dll)

Ya butuh beberapa saat untuk mengonversi sebagian besar dari itu, dan sekarang saya memiliki tugas terjadwal yang berjalan dua kali sehari untuk menyandikan barang-barang dari hari itu ke x265.

Penghematan ruang sangat besar. SAN awal saya menggunakan 20TB, sekarang sekitar 12 tetapi jelas telah ditambahkan juga dengan 6 bulan lebih banyak konten.

Saya sudah mulai transcode semua Film saya juga, bagaimanapun, itu adalah proses yang berkelanjutan, karena saya harus mengidentifikasi level kualitas (untungnya Radarr memberi label dengan baik) dan menggunakan salah satu dari tiga pengaturan transcode:

-m slower -q 18 -x --no-sao --aq-mode 3untuk 720p transcodes
-m medium -q 20 -x --no-sao --aq-mode 3untuk 1080p
-m medium -q 22 -x --no-saountuk 2160p

Semoga itu bisa membantu sebagian orang. Berteriaklah jika ada yang membutuhkan pengaturan tangan. Dan sebelum Anda menyandikan semuanya ke x265, pikirkan tentang pemutaran, jika klien tidak mendukung x265 asli, maka transcade dapat menjadi mahal dalam hal CPU dan Kualitas.

Ashleigh-Paul Charlesworth
sumber
Dengan x265 2.4 dan yang lebih baru (dengan tabel lambda baru yang memberikan encode lebih tajam), SAO biasanya merupakan hal yang baik untuk kualitas per bitrate. Masih sedikit berlumuran, tetapi mengurangi artefak lain yang cukup layak.
Peter Cordes
-q 20bukan CRF 20, itu adalah ratecontrol QP konstan . Mode standar dan yang disarankan, CRF, meningkatkan QP dalam adegan dengan kompleksitas tinggi sehingga tidak menghabiskan terlalu banyak bit pada adegan yang terlalu sulit untuk dikodekan. (Jika Anda ingin lebih dekat dengan QP seragam, naikkan qcompdari standar 0,6 ke mungkin 0,7 atau 0,8. Lebih dekat ke 1,0 lebih dekat ke CQP.)
Peter Cordes
3

Sintaks yang benar untuk mengaktifkan mode lossless untuk encoder x265 di ffmpeg adalah -x265-params lossless=1(Anda harus menambahkan =1).

Namun, untuk pengkodean lossless ada pilihan codec yang lebih baik. Saya menemukan dengan menguji bahwa FFV1 kompres jauh lebih baik (ukuran file = ~ 80% dari x265) setidaknya pada beberapa jenis video (jika pengaturan terbaik dipilih untuk kedua codec). Dan itu juga bekerja lebih cepat, dan (AFAIK) tidak dibebani oleh paten. Artinya, ini lebih unggul dari H.265 lossless dalam segala hal untuk pengarsipan video.

Sersan Borsch
sumber