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.