Як зменшити вибірку від 4k до 1080p за допомогою ffmpeg, зберігаючи якість?


21

У мене є декілька кадрів 4K 3840x2160 у форматі MP4, які мені потрібно знизити до 1080p. Я спробував бігти

ffmpeg -i orig.mp4 -vf scale=1920:1080 smaller.mp4  

але результат дуже низької якості, і все зображення складається з квадратних «плиток», ніби я збільшую 4: 1.

Ось результат виконання цієї команди:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'origs/P1000003.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
  Duration: 00:05:14.48, start: 0.000000, bitrate: 95903 kb/s
    Stream #0.0(und): Video: h264 (High), yuvj420p, 3840x2160 [PAR 1:1 DAR 16:9], 95792 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 125 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x22a3420] w:3840 h:2160 pixfmt:yuvj420p
[scale @ 0x22a3ce0] w:3840 h:2160 fmt:yuvj420p -> w:1920 h:1080 fmt:yuv420p flags:0x4
Output #0, mp4, to '1-short.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: mpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 tbn, 25 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: libvo_aacenc, 48000 Hz, stereo, s16, 200 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
frame=  125 fps=  6 q=31.0 Lsize=     968kB time=5.00 bitrate=1586.7kbits/s    
video:842kB audio:123kB global headers:0kB muxing overhead 0.421047%

Я з досвіду знаю, що ffmpeg - відмінний інструмент, тому я мушу якось викручувати параметри / параметри ...

Як я можу це зробити?


Покажіть, будь ласка, повний вихід консолі з вашої команди. Ви можете просто закодувати короткий сегмент, тому додайте, -t 10щоб зробити 10-секундний вихід. Чому ви хочете зменшити масштаб? Який випадок використання для масштабованого виводу? Ця інформація допоможе мені дати більш точну відповідь.
логіан

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

1
Не забувайте -c:a copy, оскільки вам не потрібно або потрібно перекодувати звуковий потік. Використовуйте -map 0для копіювання будь-яких метаданих глави чи інших матеріалів. (ffmpeg за замовчуванням займає лише 1 вид + 1 ауд.)
Пітер Кордес,

1
Крім того, -sws_flags lanczos+print_infoбуде використовувати кращу шкалу альго, ніж за замовчуванням (я думаю, білінеар). Відповідь stlb охоплює частину процесу, що кодує відео.
Пітер Кордес

2
@PeterCordes Як альтернативи scale=1920:-2:flags=lanczos. Я також збирався згадати про -2масштаб у своїй неіснуючій відповіді. Для тих, хто не знає, ви можете ввести -2ширину або висоту, і це автоматично забезпечить правильне значення, зберігаючи співвідношення сторін і зробивши це значення діленням на 2 (необхідне libx264 для виходів yuv420p).
логіан

Відповіді:


17

Налаштування ffmpeg за замовчуванням дуже низької якості, і оскільки ви не вказуєте жодних кодеків або параметрів якості, це просто використання за замовчуванням (я не знаю, чому розробники цього не виправляють, оскільки це створює багато питань на форумах скрізь).

Редагувати : параметри за замовчуванням тепер цілком спритні. З недавньою збіркою ffmpeg вам не потрібно вказувати нічого, крім вхідних та вихідних файлів, щоб досягти хороших корисних результатів. Можна, звичайно, підлаштувати бажання серця.

Спробуйте додати -c:v libx264 -crf 20 -preset slowдо команди.

  • -c:v libx264 каже йому використовувати кодер libx264,
  • crf 20 використовує кількісний коефіцієнт коефіцієнта постійної швидкості (який парадоксально означає змінну швидкість передачі бітів, але постійну якість) зі значенням 20 (досить хороша якість; менший - краща якість / більші файли, вище - crappier / менше),
  • slowзапрограмований ярлик для зв'язки параметрів датчика , що кошти він поміщає трохи більше зусиль, ніж за замовчуванням (середа).

Ви можете налаштувати ці налаштування, перегляньте посібник з кодування h.264, щоб отримати інструкції щодо того, які ручки перекручувати.

А якщо ви використовуєте аудіо як є, додайте c:a copy. Це зробить пряму копію аудіо потоку без повторного кодування.


Значення за замовчуванням залежить від кодера. libx264 зазвичай використовується для виведення MP4 за замовчуванням, і він дає гарний якісний вихід без додаткових опцій, але збірка ffmpeg у питанні, як видається, не підтримує цей кодер і тому використовує стародавній кодер, що mpeg4створює відео MPEG-4, частина 2, і значення за замовчуванням для нього були більш розумними протягом свого розквіту (наприклад, для 320x240 тощо).
логіан

Добре почути, що libx264 зараз є типовим.
стиб

Я б сказав , що CRF 20 досить чертовски добре. 18 функціонально без втрат. Більшість своїх відео я роблю о 23
користувач24601

Більшість моєї роботи відображається на пристроях відтворення, що працюють локально, із SD-карти. Мені не потрібно сильно оптимізувати розмір, тому я залишаю якість максимально високою. Я погоджуюсь, я б набрав це, якби здійснював доставку по Інтернету.
стиб

Це мені не допомогло. У мене все ще є дивна дивацтво, де б рух відбувався у відео. CRF 18, попередньо встановлений для уповільнення. 2,7k-> 1080p.
rewolf

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