Перекодування відеотеки в x265 (HEVC) без втрати якості


43

Я намагаюся перетворити свою відеотеку в формат HEVC, щоб отримати місце. Я виконав таку команду для всіх відеофайлів у моїй бібліотеці:

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

Зараз більшість відео конвертують штрафи і якість така ж, як і раніше. Однак декілька відео дуже високої якості (наприклад, один друк фільму об'ємом 5 Гб) втрачає якість - все відео в нерівній формі.

Я не впевнений, що робити в цьому випадку. Чи потрібно змінювати crfпараметр у моєму командному рядку? Або щось інше?

Річ у тому, що я роблю об'ємне перетворення. Отже, мені потрібен метод, де avconvавтоматично підлаштовується будь-який параметр, який потребує коригування, для кожного відео.

ОНОВЛЕННЯ-1

Я виявив, що crfце ручка, яку мені потрібно відрегулювати. CRF за замовчуванням - 28. Для кращої якості я міг би використовувати щось менше 28. Наприклад:

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

Однак проблема полягає в тому, що для деяких відео CRF значення 28 досить добре, тоді як для деяких відео потрібна нижча CRF. Це те, що я повинен перевірити вручну, перетворюючи невеликі розділи великих відео. Але в масовому перетворенні, як я перевіряю кожне відео вручну? Чи є їх якийсь спосіб avconvінтелектуально налаштувати CRF відповідно до вхідного відео?

ОНОВЛЕННЯ-2

Я виявив, що --losslessв x265 є варіант: http://x265.readthedocs.org/en/default/lossless.html .

Однак я не знаю, як правильно ним користуватися. Я спробував використовувати його наступним чином, але це дало протилежні результати (відео було ще більш піксельним):

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

1
--losslessнасправді може збільшити файл, якщо він декодує раніше втрачений кодек, а потім пояснює те, що він декодував без втрат. Якість залишиться точно такою ж, як і вхідна.
Голар Рамблар

2
Якщо ваші джерела закодовані у збитки (що, швидше за все,), то те, чого ви намагаєтеся досягти, неможливо. Будь-яке перекодування, яке не є без втрат, ще більше погіршить якість (навіть якщо це не буде видно відразу), і якщо ви перетворитеся з втрати в програш без втрат, ви отримаєте більші розміри файлів.
Сардж Борщ

Відповіді:


58

З мого власного досвіду, якщо ви хочете абсолютно не втрачати якість, - без втрат - це те, що ви шукаєте.

Не впевнений, avconvале команда, яку ви ввели, виглядає ідентично тому, що я роблю FFmpeg. У FFmpegви можете передати параметр , як це:

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

Більшість x265комутаторів (опції без значення) можна вказати так (крім тих, що мають лише CLI, вони використовуються лише з x265двійковими безпосередньо).

Якщо це не вдається, я хотів би поділитися своїм досвідом x265кодування. Для більшості відео (будь то WMV, MPEG або AVC / H.264), які я використовую crf=23. x265визначає решту параметрів і зазвичай це робить досить хорошу роботу.

Однак часто, перш ніж я зобов’язуюся перекодувати відео в повному обсязі, я перевіряю свої налаштування, перетворюючи невелику частину відповідного відео. Ось приклад, припустимо, mkv-файл із потоком 0 - відео, потік 1 - аудіо DTS, а потік 2 - підзаголовком:

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"

Зауважте, що сигнальна лінія зворотних нахилів переривається в довгій команді, я роблю це, щоб допомогти мені відслідковувати різні біти складного вводу CLI. Перш ніж я пояснюю це по черзі, частина, в якій ви конвертуєте лише невелику частину відео, - це другий рядок, а другий останній рядок: -ss 0означає шукати 0 секунди, перш ніж розпочне декодування вводу, і -t 120означає припинити запис на вихід через 120 секунд. Ви також можете використовувати hh: mm: ss або hh: mm: формати часу ss.sss.

Тепер по черзі:

  1. -hide_bannerне дозволяє FFmpegвідображати інформацію про збірку при запуску. Мені просто не хочеться бачити це, коли прокручую консоль вгору;
  2. -ss 0прагне 0 секунди до початку декодування вводу. Зауважте, що якщо цей параметр задано після вхідного файлу та перед вихідним файлом, він стає параметром виводу та повідомляє ffmpegрозшифрувати та проігнорувати вхід до x секунд, а потім почніть записувати на вихід. Як варіант введення, він менш точний (оскільки пошук не є точним у більшості форматів контейнерів), але займає майже не час. Як вихідний варіант, він є дуже точним, але потребує значної кількості часу, щоб розшифрувати весь потік до зазначеного часу, і для цілей тестування ви не хочете витрачати час;
  3. -i "INPUT.mkv": Вкажіть вхідний файл;
  4. -attach "COVER.jpg": До результату додайте обкладинку (мініатюрну картинку, плакат, що завгодно). Образ обкладинки зазвичай відображається у файлах пошуку;
  5. -map_metadata 0: Скопіюйте будь-які метадані з вводу 0, який у прикладі є лише входом;
  6. -map_chapters 0: Скопіюйте інформацію про главу (за наявності) з вводу 0;
  7. -metadata title="TITLE": Встановити назву відео;
  8. -map 0:0 ...: Потік карти 0 на вході 0, це означає, що ми хочемо, щоб перший потік з входу був записаний на вихід. Так як цей потік є відеопотік, це перший відео потік в виході , отже , потік специфікатор :s:v:0. Встановіть її мовний тег на англійську;
  9. -map 0:1 ...: Аналогічно до рядка 8, картографуйте другий потік (аудіо DTS) та встановіть його мову та назву (для легшої ідентифікації при виборі з гравців);
  10. -map 0:2 ...: Подібно до рядка 9, за винятком цього потоку є підзаголовком;
  11. -metadata:s:t:0 ...: Встановити метадані для обкладинки. Це потрібно для формату контейнерів mkv;
  12. -c:v libx265 ...: Параметри відео кодеків. Це так довго, що я розбив його на два рядки. Цей параметр хороший для високоякісного бларрейного відео (1080p) з мінімальним нахилом у градієнті (який х265 смокче). Це, швидше за все, надлишок DVD-дисків, телевізійних шоу та відео-телефонів. Цей параметр здебільшого вкрадений з цієї публікації Doom9 ;
  13. crf=22:...: Продовження параметрів відеокодеку. Дивіться вищезгаданий пост на форумі;
  14. -c:a copy: Копіювання аудіо;
  15. -c:s copy: Копіювання субтитрів;
  16. -t 120: Припиніть записувати на висновок через 120 секунд, що дає нам 2-хвилинний кліп для попереднього перегляду якості транкодування;
  17. "OUTPUT.HEVC.DTS.Sample.mkv": Назва вихідного файлу. Я позначаю назви своїх файлів відеокодеком та основним звуковим кодеком.

Вау. Це моя перша відповідь, тому якщо я щось пропустив, залиште коментар. Я не фахівець з виробництва відео, я просто хлопець, який лінивий дивитись фільм, вставляючи диск у програвач.

PS. Можливо, це питання належить десь іншому, оскільки воно не дуже пов’язане з Unix та Linux.


2
Саме те, що я шукав! Приємне висвітлення варіантів. Чи знаєте ви, чи ffmpeg буде працювати, c:s copyякщо немає вмісту підзаголовків?
Старійшина Гек

1
@ElderGeek Ні, ffmpeg скаже щось лише тоді, коли цей варіант матиме якийсь ефект.
Іфен Му Му

Чи створює цей параметр найменший розмір файлу для справді кодування h265 без втрати? Якщо ні, чи є спосіб я це зробити?
Буфер над

1
@TheBitByte Я не думаю, що в h265 рівень стиснення без втрат. Для менш стислих варіантів це просто --lossless. Я даремно шукав перетворення без втрат від h264 до h265, і те, що я дізнався, говорить про те, що це математично неможливо.
Іфенг Му

1
Ви дійсно повинні відредагувати команду, що містить --losslessвимикач з цієї відповіді, тому що поставлена ​​там як відповідь на це питання, це звучить так, ніби ви говорите, що це стиснення без втрат, що вводить в оману.
Хашим

8

Нещодавно я пережив проблему перекодування всього свого каталогу каталогів до HEVC. Я використовую https://github.com/FallingSnow/h265ize із наступними налаштуваннями.

h265ize -v -m середній -q 20 -x --no-sao --aq-mode 3 --delete --stats

-v - Дослідний вихід
-m середній - Середня швидкість кодування (менша вища якість, все повільніше, я вважаю, не вартує часу / якості різниці)
-q 20 - використовуваний CRF, 20 схожий на 18 або більше в x264, але так. Це для вмісту 1080p (90% мого телевізора) Я схильний використовувати 22 для своїх 4K фільмів
-x - Використовуйте центральні команди x265 -
no-sao вимикає
зразкове адаптивне зміщення (покращує швидкість кодування) - режим qaq 3 - використання адаптивного квантування з автоматичною дисперсією, допомагає 8BIT кодує, особливо в темних областях, зупиняє більшість з обв'язки , що може статися (за рахунок часу кодування , хоча)
--delete - замінити кодує файл з закодованим файлом (тест перед використанням цього один )
--стати - Випишіть статистику до файлу csv у корені шляху, з якого ви бігли.

Швидкість кодування становить близько 30 кадрів в секунду (для більшості матеріалів 1080p) на моїй установці. Подвійний Xeon E5 2687W v2, але я змушую FFMPEG-процес не використовувати першу сторону одного з процесорів (це мій сервер Plex, тому потрібно переконатися, що при перегляді потрібно перекодувати код, якщо потрібно)

Так, знадобилось певний час, щоб перетворити більшу частину цього завершення, і тепер у мене є планове завдання, яке виконується двічі на день, щоб кодувати речі з цього дня на x265.

Економія місця була величезною. Мій початковий SAN використовувався в 20 Тб, зараз він становить близько 12, але, очевидно, теж було додано вміст на 6 місяців більше.

Я також почав перекодувати всі свої фільми, однак це триває процес, оскільки я маю визначити рівні якості ідентифікаторів (Radarr, на щастя, мітки, тоді добре) і використовувати один з трьох параметрів перекодування:

-m slower -q 18 -x --no-sao --aq-mode 3для транскодів 720p,
-m medium -q 20 -x --no-sao --aq-mode 3для 1080p
-m medium -q 22 -x --no-saoдля 2160p

Сподіваюся, що допомагає деяким людям. Кричи, якщо комусь потрібна рука, все це налаштує. І перед тим, як кодувати все до x265, подумайте про відтворення, якщо клієнт не підтримує рідну x265, тоді транскада може бути дорогою з точки зору процесора та якості.


З x265 2.4 та пізнішими версіями (з новими лямбда-таблицями, які дають чіткіші коди), SAO, як правило, є хорошою річчю щодо якості на бітрейт. Він все ще трохи змащується, але зменшує інші артефакти, щоб бути вартими цього.
Пітер Кордес

-q 20не є CRF 20, це постійний контроль швидкості QP . Режим CRF за замовчуванням і CRF підвищує рівень QP у сценах з високою складністю, тому він не витрачає занадто багато бітів на сцени, які важко кодувати. (Якщо ви хочете наблизитись до рівномірного QP, піднімайте qcompз дефолту 0,6, можливо 0,7 або 0,8. Ближче до 1,0 ближче до CQP.)
Пітер Кордес,

3

Правильний синтаксис для включення режиму без втрат для кодера x265 у ffmpeg є -x265-params lossless=1(потрібно додати =1).

Однак для кодування без втрат є кращі варіанти кодеків. Я перевірив, що FFV1 стискає набагато краще (розмір файлу = ~ 80% від x265) принаймні на деяких видах відео (якщо найкращі налаштування обрані для обох кодеків). І це також працює швидше, і (AFAIK) не обтяжений патентами. Тобто, він найкраще стосується H.265 без втрат у всіх параметрах для архівування відео.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.