Вопрос или проблема
Я создаю видео из одного изображения с помощью ffmpeg и добавляю текст поверх видео.
Как я могу drawtext
, чтобы он накладывался на масштабированное видео, а не на масштаб изображения?
Сейчас, когда я добавляю текст, координаты X и Y начинаются с верхнего левого угла изображения, а не с самого масштабированного видео. Изображение имеет меньшие размеры, чем масштаб видео, поэтому мне нужно нарисовать текст независимо от размера изображения. Если текст выходит за пределы масштаба изображения, он обрезается, хотя незаполненная черная рамка оставшегося масштабированного видео по-прежнему присутствует.
Это команда, которую я использую.
ffmpeg -loop 1 -r 1 -i image.jpg -b:v 1M -vf "scale=320:240, drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf: text="Тестовый текст": x=200: y=100: fontsize=30: [email protected]: box=1: [email protected]" -t 20 output.mp4
Если изображение – единственный источник видео, то видео это просто изображение, и “накладывать с верхнего левого угла видео” означает то же самое, что “накладывать с верхнего левого угла изображения“. Так что вы делаете это правильно.
Черная рамка, о которой вы упоминаете, не является частью видео. Она вставляется некоторыми медиаплеерами при открытии очень узких видео, потому что панель управления медиаплеера шире, чем само видео. Например, медиаплеер VLC имеет достаточно широкие элементы управления/меню, и он обрамляет видео большими рамками. Но Windows Media Player не отображает черной рамки, так как его элементы управления помещаются в ширину видео 320p.
Я это наладил с помощью команды ниже:
ffmpeg -loop 1 -i image.jpg -r 29.970 -c:v libx264 -t 15 -pix_fmt yuv420p -profile:v high -level 4.2 -vf "scale=1920:1080, drawtext = text="Возобновление через %{eif\:15-t\:d}": x=200: y=100: fontsize=30: [email protected]: box=1: [email protected]" out.mp4
Ответ или решение
Для добавления текста с помощью FFmpeg на видео, созданное из изображения, и чтобы при этом текст отображался относительно масштаба видео, а не изображения, следует учитывать несколько ключевых моментов в процессе настройки командной строки.
Проблема
При использовании команды FFmpeg для создания видео из одного изображения и наложения текста, возникает ситуация, когда координаты X и Y для текста определяются от верхнего левого угла изображения, а не от верхнего левого угла итогового видео. Это приводит к тому, что текст может обрезаться, если его положение не скорректировано в соответствии с размером масштабированного видео.
Решение
Чтобы решить эту проблему, необходимо правильно настроить команду FFmpeg. Основным требованием является использование фильтра scale
перед фильтром drawtext
, чтобы гарантировать, что координаты для текста рассчитываются на основе окончательной ширины и высоты видео, а не исходного изображения.
Команда FFmpeg
Вот пример правильной команды, которая может быть использована:
ffmpeg -loop 1 -i image.jpg -r 29.970 -c:v libx264 -t 15 -pix_fmt yuv420p -profile:v high -level 4.2 -vf "scale=1920:1080, drawtext=text='Тестовый текст':x=200:y=100:fontsize=30:fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf:box=1:boxcolor=black@0.5" output.mp4
Пояснение команды
- -loop 1: Повторяет изображение, чтобы создать необходимое время видео.
- -i image.jpg: Указывает входное изображение.
- -r 29.970: Устанавливает частоту кадров.
- -c:v libx264: Кодирует видео с использованием кодека H.264.
- -t 15: Устанавливает длительность видео в 15 секунд.
- -pix_fmt yuv420p: Задает формат пикселей, совместимый с большинством медиа-плееров.
- -profile:v high -level 4.2: Устанавливает профиль и уровень H.264 для совместимости.
- -vf: Указывает видеофильтр, который применим к видео.
- scale=1920:1080: Масштабирует видео до разрешения 1920×1080.
- drawtext: Используется для наложения текста на видео:
- text=’Тестовый текст’: Указывает текст, который будет отображаться.
- x=200:y=100: Определяет положение текста относительно масштабированного видео.
- fontsize=30: Устанавливает размер шрифта текста.
- fontfile=…: Указывает путь к файлу шрифта для текстовой наложки.
- box=1: Включает обрамляющую коробку вокруг текста.
- boxcolor=black@0.5: Устанавливает цвет и прозрачность коробки.
Рекомендации
- Убедитесь, что шрифт доступен по указанному пути. В противном случае текст может не отображаться.
- При необходимости корректируйте параметры x и y в зависимости от вашего дизайна и общего оформления видео.
- Проверяйте вывод, чтобы убедиться, что текст отображается должным образом и в нужном месте.
Заключение
Используя приведенные инструкции, вы сможете наложить текст на видео, созданное из изображения, с правильным позиционированием относительно масштаба видео. Это решение обеспечит корректное восприятие текста и его непрерывное отображение в пределах видимой области видео.