image + audio = mp4: як зробити відео менше?


12

Я використовую ffmpeg, щоб додати JPG до MP4, щоб зробити MP4.

Оскільки для створення відео є лише одне зображення, мені цікаво, чи є спосіб зменшити розмір відео?

Команда:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

Результати:

  • image.jpg = 26,7 К (зображення не настільки чітке)
  • audio.mp3 = 64,6 млн. (54 хв.)
  • output.mp4 = 80,6 млн. (Результат відео не настільки чіткий, музика все ще хороша)

Це прийнятний розмір для MP4?


Цікаво, чи можна мета mp4 так, щоб він відтворював лише mp3 і тримати екран фіксованим на одному jpg, щоб зберегти розмір :)
SIDU

Який цільовий програвач, пристрій чи сайт для виводу?
логікан

Я намагаюся завантажити .mp4 на Youtube.com
SIDU

Відповіді:


18

Для завантаження на YouTube

H.264: найменші файли

Цей метод використовує libx264 для кодування відео H.264. Це повільніше, ніж метод потокового копіювання нижче, але потенційно виведе менший розмір файлу.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

Потокова копія: найшвидший процес

Цей метод просто передає копії зображення (без кодування) зображення в контейнер MKV. Це дуже швидко, але якщо розмір важливий, ніж метод, описаний вище, може створити менший файл.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • YouTube приймає практично все, тому ці команди використовують кілька хитрощів, щоб зробити кодування швидше або зробити розмір файлу невеликим, а якість зберегти високою, оскільки YouTube перекодує все, що ви йому надаєте. Ваш програвач, мабуть, не сподобається, але YouTube буде.

  • У цих прикладах використовується дуже низька частота кадрів, яка повинна оброблятись швидше, ніж за замовчуванням 25 кадрів в секунду.


Найширша сумісність для будь-якого гравця

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • Це повинно зіграти на що завгодно , за винятком дуже древніх пристроїв (зміна -profile:v mainдо , -profile:v baselineякщо це має місце).

  • Якщо ваш аудіовхід вже є AAC, змініть -c:a aacйого, -c:a copyщоб уникнути зайвого повторного кодування.

  • Час кодування буде довшим, а розмір файлу - більшим, ніж команди YouTube вище.

  • Додаткову інформацію див. У FFmpeg Wiki: H.264 .


Чи можете ви надати рядок коду, щоб зробити a.jpg + a.mp3 = a.mp4 у 1280 * 720 з найнижчими кадрами / сек, дозволеними youtube? Крім того, що є лише одна робота, чи потрібно мені видалити "-loop 1"? Заздалегідь спасибі.
СІДУ

@SIDU Існуюча команда виконує те, що ви вимагаєте (крім виведення MKV замість MP4), але я не знаю, найнижча частота кадрів, яку підтримує YouTube. Вам просто доведеться експериментувати. Чому вам потрібен MP4, коли ви просто завантажуєте його на YouTube?
llogan

Я спробував це, але в ньому написано:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules

@NineCattoRules Важко сказати без додаткової інформації. Використовуйте пастин-сайт, щоб показати повну ffmpegкоманду та повний вихід консолі з команди, а потім надайте посилання в коментарі.
логіан

Дякую, я перевстановив FFMPEG за допомогою сховища mc3man і зараз працює добре!
NineCattoRules

3

Маючи лише інформацію, яку ви надали, це те, що я можу придумати.

Пройдемо по шматочках:

Оскільки до відео додано лише одне зображення. Мені цікаво, чи є спосіб зменшити розмір відео, наприклад, сила бітової швидкості / секунди = 1 замість 28?

Оскільки це нерухомий образ, змінювати його не потрібно. просто залишайся на місці.

Що ви там говорите, це кадрів в секунду (кадрів в секунду), а не бітрейт. І ти маєш рацію в концепції. Зобразіть лише одне нерухоме зображення на 1 кадр / с, це не буде проблемою.

Це прийнятний розмір для mp4? Чи багато значення має розмір зображення?

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

Чи слід змінити розмір jpg до 1080 * 720 і зробити додаткові параметри у ffmpeg, щоб вивести 720p (що таке настройка ffmpeg :)?

Роздільна здатність, яку ви говорите, - 1280x720.

Я не бачу сенсу у -loop 1варіанті тут, це лише сповільнить процес. Ви використовували -shortestпричину, що у файлу більше 1 вхідного потоку? Якщо ні, то немає ніяких причин використовувати його. Оскільки ви використовували, -acodec copyя повинен будете припустити, що ви не хочете перекодувати його.

Для виходу 720p 1 кадрів в секунду без перекодування та не торкаючись бітрейта:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

Визначте випадок, що він містить більше одного вхідного потоку, і ви хочете, щоб ffmpeg закінчив кодування найкоротшим потоком:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

Тепер якщо вам доведеться змінити бітрейт (скажімо, 1024k як приклад);

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

Див.: Обмеження вихідного бітрейта

-c: копія = Скопіюйте вхідний аудіопотік, щоб ми не перекодували повторно.

-b: v = Бітрейт, вказаний, щоб бути (не точно) постійним.

-bufsize = Це інтервал, в якому обчислюється середній бітрейт. Значить найменше зображення з більшою якістю втрат, але більш точні бітрейти відповідно до вказаного в -b: v .

-s = фактичний розмір відеовиходу.

-framerate = Частота вхідного кадру, яку ми хочемо, щоб використовувався вихід.

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

З того, що ви говорите, надану вами інформацію та те, що ви намагаєтеся зробити, я думаю, що ви вважаєте, що ваша мета - вбудувати альбом-арт у mp3. Якщо це ваша мета, це краще відповідатиме вашим вимогам:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = Специфікатор метаданих ffmpeg для виводу файлу з infile. У цьому випадку ( нуль ) глобальні метадані.

-map 0 = вхідний потік 1 (аудіо).

-map 1 = вхідний потік 2 (зображення).

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


Розглянемо використання -framerateв якості опції введення та видалення виводу -r: інакше буде використана стандартна ffmpegрамка вводу за замовчуванням 25, а потім випадуть кадри для досягнення -r 1. Якщо ви просто оголосите частоту кадрів вхідного сигналу, то для виводу буде використана однакова частота кадрів.
llogan

Дякую. Не знав цього. Відредаговано для відображення запропонованих змін.
Фенрір

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