Як змінити розмір кадру, зберігши ширину (за допомогою ffmpeg)?


21

Я новачок на цьому сайті StackExchange та у використанні кодера FFmpeg. У мене є відео розміром 720x480 (3: 2), яке я хотів би змінити на 720x406 (16: 9), щоб відповідати іншим відео, які я маю для сайту. Я спробував різні комбінації команд, включаючи:

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

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

Які саме відповідні параметри / параметри потрібно передати (якщо я маю більше контролю за допомогою командного рядка) для досягнення потрібного розміру кадру?

Відповіді:


36

використання фільтра масштабу зробить це, але є ще трохи.

ffmpeg -i input.mov -vf scale=720x406 output.mov 

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

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

Крім того, ви можете встановити співвідношення сторін відображення на все, що завгодно, таким чином:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

Те, що я роблю з командою -vf та виразами x = y, z =, що випливає, - це створити ланцюжок фільтрів . Фільтри можуть бути досить складними, але при найпростішому використанні вони приймають форму effect=parameter,nexteffect=anotherparameter, і вони обробляються в тому порядку, коли ви їх записуєте.

Ви можете поставити додаткові команди для кодека тощо, наприклад, -c:v libx264використовувати кодер x264 mp4 і щось на зразок -crf 20встановити коефіцієнт постійної швидкості в 20 (зазвичай це досить хороший компроміс між розміром і якістю). Отже, досить повна команда виглядатиме так:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

Основний профіль хороший для сумісності пристроїв, slowпопередньо встановлений кодер libx264 - це досить хороший баланс швидкості та якості, тому це хороший загальний робочий коник для веб-кодування. Ви можете зробити це швидше, використовуючи fastабо veryfastповільніше, veryslowі placeboзробить це колись трохи краще, ніж veryslowза рахунок набагато більше часу на обробку (звідси назва).

ДО РЕЧІ Не використовуйте -c копію , що означає просто скопіювати відео і аудіо потоки , нічого не роблячи для них на всіх , так що ви нічого зробити з точки зору масштабу, кодек, бітрейт і т.д. матиме ніякого ефекту.


1
Якщо ви використовуєте останні версії ffmpeg, вам більше не потрібно вказувати x264 як кодек, але все ж, можливо, варто переглянути, які параметри вам можуть захотіти.
стиб

1
Я думаю, що метадані мають лише поле DAR. Тож використання setsarпросто опосередковано встановлює DAR?
jiggunjer

Мені доводиться використовувати "-c копію", але з іншого боку я хочу змінити розмір екрана. Як я можу цього досягти?
Dr.jacky

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