Как создать видеоклип из файла изображения с помощью ffmpeg, который можно будет соединить с клипом, снятым на телефон.

Вопрос или проблема

Моя настройка
Я использую Arch Linux и ffmpeg версии n7.1.
Все программное обеспечение ОС и приложения обновлены, все самые последние доступные версии программного обеспечения.

Оригинальный видеоклип
У меня есть видео, снятое на мой телефон, Xiaomi Note 10 Pro 5G. Это Android телефон. Видео было снято в 720p 30fps режиме телефона. Когда я переношу видеоклип на свой ноутбук и смотрю его, он отображается в портретном режиме и имеет размер 720 пикселей в ширину и 1280 пикселей в высоту.
Я разместил различные выводы из инструментов ffmpeg и mediainfo ниже, которые характеризуют этот видеоклип, чтобы мы могли увидеть его свойства.
Также я разместил ссылки на видеоклип и другие файлы ниже.

Что я пытаюсь сделать
Я хочу создать 5-секундный видеоклип из статического файла изображения, размером 720 пикселей в ширину и 1280 пикселей в высоту, используя ffmpeg, чтобы этот клип имел идентичные свойства и характеристики кодирования, как и клип, снятый телефоном, во всех отношениях.

Важно, чтобы видеоклип, созданный из файла изображения с помощью ffmpeg, имел идентичные свойства и характеристики кодирования с клипом, снятым на телефон, поскольку я хочу объединить эти клипы вместе без перекодирования.

Если они не будут полностью совместимы с идентичными характеристиками кодирования, я не смогу объединить их вместе. Тогда будет необходимо перекодировать/перерендерить файлы, чтобы добавить их друг к другу. Перерендерирование — это не то, что я хочу рассматривать.

Моя команда объединения выглядит так

ffmpeg -i "concat:in_clip_1.mp4|in_clip_2.mp4" -c copy out_clip_1.mp4

Я знаю, что для объединения видеофайлов вместе, характеристики кодирования и видеофайлов должны быть точно такими же, идентичными, для всех видеофайлов. Я знаю это, потому что файлы, закодированные из одного источника, тем же способом, например, моего телефона, объединяются без проблем, но не файлы, закодированные по-другому.

Мне еще не удалось объединить мой созданный видеофайл и файл, снятый на телефоне, вместе успешно.

Может кто-нибудь предложить успешный подход и, возможно, даже строку ffmpeg, которую я могу использовать для создания совместимых файлов, которые можно объединить вместе

Вот файл изображения и видеоклип, которые я использую
in_image_file.png
https://drive.google.com/file/d/1KiJaH5DnZxIHGKaCmvHZJEdZzir1qop2/view?usp=sharing

видеофайл
https://drive.google.com/file/d/1RB6acYXEZ3tLuFc8_0vEp6TdjOFq_SC2/view?usp=sharing

Вот моя последняя командная строка, которая не работает
Я пытаюсь воспроизвести все свойства оригинального видеоклипа здесь.

ffmpeg -loop 1 -i in_image_file.png -c:v libx265 -preset medium -profile:v main -level:v 3.1 -vf "scale=720:1280,format=yuv420p,setsar=1" -x265-params "qp=23:keyint=60:min-keyint=60:no-scenecut=1" -b:v 10790k -maxrate 10790k -bufsize 21580k -r 30000/1001 -pix_fmt yuv420p -color_range tv -colorspace bt709 -color_primaries bt709 -color_trc bt709 -t 5 -an out_5sec_clip.mp4

Вот результат работы инструментов mediainfo для оригинального клипа

mediainfo --Details=1 VID_20250226_165257.mp4 > file_characteristics.txt

Содержимое файла по ссылке
https://drive.google.com/file/d/1caols_pRipZd-QPPJt77xii5NjDNt5w-/view?usp=sharing

Вот результат работы инструментов mediainfo для оригинального клипа

mediainfo VID_20250226_165257.mp4

Общие
Полное название : VID_20250226_165257.mp4
Формат : MPEG-4
Профиль формата : Base Media / Version 2
Идентификатор кодека : mp42 (isom/mp42)
Размер файла : 13.7 MiB
Продолжительность : 9 s 841 ms
Общая битовая скорость : 11.7 Mb/s
Частота кадров : 30.034 FPS
Дата кодирования : 2025-02-26 16:55:58 UTC
Дата тега : 2025-02-26 16:55:58 UTC
xyz : +57.0696-002.1027/
Версия Android : 13
Производитель Android : Xiaomi
Модель Android : M2104K10AC

Видео
ID : 1
Формат : HEVC
Формат/Информация : Высокоэффективное кодирование видео
Профиль формата : [email protected]@Main
Идентификатор кодека : hvc1
Идентификатор кодека/Информация : Высокоэффективное кодирование видео
Продолжительность : 9 s 841 ms
Исходная продолжительность : 9 s 789 ms
Битовая скорость : 10.8 Mb/s
Ширина : 1 280 пикселей
Высота : 720 пикселей
Соотношение сторон : 16:9
Поворот : 90°
Режим частоты кадров : Переменный
Частота кадров : 30.034 FPS
Минимальная частота кадров : 29.910 FPS
Максимальная частота кадров : 42.878 FPS
Цветовое пространство : YUV
Субдискретизация цветности : 4:2:0
Глубина цвета : 8 бит
Биты/(пиксель*кадр) : 0.390
Размер потока : 12.6 MiB (92%)
Исходный размер потока : 12.6 MiB (92%)
Название : VideoHandle
Язык : Английский
Дата кодирования : 2025-02-26 16:55:58 UTC
Дата тега : 2025-02-26 16:55:58 UTC
Диапазон цветности : Ограниченный
Цветовые первичные : BT.709
Характеристики передачи : BT.709
Коэффициенты матрицы : BT.709
Длительность mdhd : 9841
Конфигурационный блок кодека : hvcC

Аудио
ID : 2
Формат : AAC LC
Формат/Информация : Упрощенный кодек Advanced Audio Codec
Идентификатор кодека : mp4a-40-2
Продолжительность : 9 s 792 ms
Режим битовой скорости : Постоянный
Битовая скорость : 256 kb/s
Каналы : 2 канала
Расположение каналов : L R
Частота дискретизации : 48.0 kHz
Частота кадров : 46.875 FPS (1024 SPF)
Режим сжатия : С потерями
Размер потока : 306 KiB (2%)
Название : SoundHandle
Язык : Английский
Дата кодирования : 2025-02-26 16:55:58 UTC
Дата тега : 2025-02-26 16:55:58 UTC

Вот результат работы ffmpeg для оригинального клипа

ffmpeg -i VID_20250226_165257.mp4 -c:v copy -bsf:v hevc_metadata -f null -

версия ffmpeg n7.1 Copyright (c) 2000-2024 разработчики FFmpeg
собрано с gcc 14.2.1 (GCC) 20240910
конфигурация: –prefix=/usr –disable-debug –disable-static –disable-stripping –enable-amf –enable-avisynth –enable-cuda-llvm –enable-lto –enable-fontconfig –enable-frei0r –enable-gmp –enable-gnutls –enable-gpl –enable-ladspa –enable-libaom –enable-libass –enable-libbluray –enable-libbs2b –enable-libdav1d –enable-libdrm –enable-libdvdnav –enable-libdvdread –enable-libfreetype –enable-libfribidi –enable-libglslang –enable-libgsm –enable-libharfbuzz –enable-libiec61883 –enable-libjack –enable-libjxl –enable-libmodplug –enable-libmp3lame –enable-libopencore_amrnb –enable-libopencore_amrwb –enable-libopenjpeg –enable-libopenmpt –enable-libopus –enable-libplacebo –enable-libpulse –enable-librav1e –enable-librsvg –enable-librubberband –enable-libsnappy –enable-libsoxr –enable-libspeex –enable-libsrt –enable-libssh –enable-libsvtav1 –enable-libtheora –enable-libv4l2 –enable-libvidstab –enable-libvmaf –enable-libvorbis –enable-libvpl –enable-libvpx –enable-libwebp –enable-libx264 –enable-libx265 –enable-libxcb –enable-libxml2 –enable-libxvid –enable-libzimg –enable-libzmq –enable-nvdec –enable-nvenc –enable-opencl –enable-opengl –enable-shared –enable-vapoursynth –enable-version3 –enable-vulkan
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.100 / 61. 19.100
libavformat 61. 7.100 / 61. 7.100
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 4.100 / 10. 4.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ‘VID_20250226_165257.mp4’:
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2025-02-26T16:55:58.000000Z
location : +57.0696-002.1027/
location-eng : +57.0696-002.1027/
com.android.version: 13
com.android.manufacturer: Xiaomi
com.android.model: M2104K10AC
Duration: 00:00:09.84, start: 0.000000, bitrate: 11700 kb/s
Stream #0:00×1: Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 1280×720, 10808 kb/s, 30.03 fps, 30 tbr, 90k tbn (default)
Metadata:
creation_time : 2025-02-26T16:55:58.000000Z
handler_name : VideoHandle
vendor_id : [0][0][0][0]
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:10×2: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 256 kb/s (default)
Metadata:
creation_time : 2025-02-26T16:55:58.000000Z
handler_name : SoundHandle
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to ‘pipe:’:
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
com.android.model: M2104K10AC
location : +57.0696-002.1027/
location-eng : +57.0696-002.1027/
com.android.version: 13
com.android.manufacturer: Xiaomi
encoder : Lavf61.7.100
Stream #0:0(eng): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 1280×720, q=2-31, 10808 kb/s, 30.03 fps, 30 tbr, 90k tbn (default)
Metadata:
creation_time : 2025-02-26T16:55:58.000000Z
handler_name : VideoHandle
vendor_id : [0][0][0][0]
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1(eng): Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s (default)
Metadata:
creation_time : 2025-02-26T16:55:58.000000Z
handler_name : SoundHandle
vendor_id : [0][0][0][0]
encoder : Lavc61.19.100 pcm_s16le
[out#0/null @ 0x59ec83e50b40] video:12916KiB audio:1836KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
frame= 294 fps=0.0 q=-1.0 Lsize=N/A time=00:00:09.79 bitrate=N/A speed= 167x

.

Ответ или решение

Для создания видеофайла из статичного изображения с использованием FFmpeg и последующего его объединения с видео, снятым на смартфон, необходимо обеспечить идентичные свойства и характеристики кодирования обоих видеофайлов. Рассмотрим теоретическую часть, примеры и приложение в соответствии с вашим запросом.

Теоретическая часть (Theory)

Процесс объединения (конкатенации) видеоклипов требует, чтобы их параметры, такие как кодек, битрейт, разрешение, частота кадров и цветовое пространство, совпадали. Особенно это важно в случаях, когда вы не хотите осуществлять перекодировку, так как она требует дополнительных вычислительных ресурсов и времени, а также может снизить качество видео.

Ключевые параметры, которые необходимо учесть:

  1. Разрешение и соотношение сторон: ваши исходные видео и создаваемый клип должны иметь разрешение 720×1280, что соответствует портретной ориентации.
  2. Частота кадров: должна совпадать с оригинальной — в вашем случае это приблизительно 30 FPS.
  3. Кодек видео: оригинальное видео использует HEVC (h265), поэтому вы должны кодировать изображение в этот же формат.
  4. Параметры цветового пространства: такие как цветовое пространство (bt709) и цветовой диапазон (tv).
  5. Аудио: если оригинальное видео содержит аудиодорожку, убедитесь, что создаваемое видео также имеет идентичные аудиопараметры. Если аудиотрека нет, его отсутствие в обоих видео также может быть принято.

Пример (Example)

Исходя из вашей команды, необходимо сделать некоторые корректировки. Давайте создадим видео из статического изображения, используя наилучшие параметры, взятые из оригинального видео:

ffmpeg -loop 1 -i in_image_file.png -c:v libx265 -preset medium -level 3.1 -vf "scale=1280:720,format=yuv420p,setsar=1" -x265-params "crf=23:keyint=30:min-keyint=30:no-scenecut" -b:v 10808k -maxrate 10808k -bufsize 21616k -r 30.034 -pix_fmt yuv420p -color_range tv -colorspace bt709 -color_primaries bt709 -color_trc bt709 -t 5 -an out_5sec_clip.mp4

Применение (Application)

  1. Подготовка изображения: Убедитесь, что изображение изначально имеет правильное разрешение 720×1280, чтобы избежать добавления черных полос и неправильного масштабирования. Вы можете использовать такие программы, как GIMP или Photoshop, для изменения размера изображения заранее.

  2. Настройка FFmpeg:

    • -loop 1: циклично использовать одно изображение.
    • -t 5: продолжительность видео 5 секунд.
    • -vf "scale=1280:720": масштабирование изображения до 1280×720 (портретное).
    • Кодек: убедитесь, что видео кодируется в HEVC с аналогичными параметрами.
  3. Анализ выходного видео:

    • Используйте mediainfo для проверки характеристик созданного файла и убедитесь, что все параметры совпадают с оригинальным видео.
    • Если в исходном видео присутствует аудио, а в создаваемом клипе его нет, убедитесь, что это учтено при конкатенации. Иногда для успешного объединения нужно добавить "пустой" аудиотрек.
  4. Конкатенация видео:

    • После корректного создания видеоклипа из изображения и проведения всех проверок, можно использовать команду для объединения:
      ffmpeg -i "concat:original_video.mp4|out_5sec_clip.mp4" -c copy final_output.mp4
    • Убедитесь, что не возникает ошибок при конкатенации и оба видео играются без проблем.

Создание видео из изображения и его последующее объединение с другими клипами без перекодирования требует точного соответствия техническим характеристикам оригинала и внимательного анализа. Такой подход позволяет сохранить исходное качество и избежать дополнительных затрат времени и ресурсов.

Оцените материал
Добавить комментарий

Капча загружается...