Вопрос или проблема
Предположим, у меня есть два видеофайла A и B.
Теперь я хочу конвертировать A в тот же формат (т.е. тот же контейнер, тот же аудио и видео кодек), тот же битрейт, размер и т.д. как и B.
Есть ли способ сделать это автоматически (т.е. без извлечения информации вручную и ввода ее вручную в качестве параметров) с помощью командной строки (или даже инструмента с графическим интерфейсом)?
Думаю, если вы проанализируете вывод ffmpeg, можно частично достичь этой цели, но будьте осторожны с запутанной документацией о том, как кодировать для наилучших результатов. Это немного сложно.
Возможно, альтернативный подход — это найти общий стандарт, параметры которого можно установить один раз, и оставить работу перекодировщика для всех A, B и т.д.
Нет возможности сделать так, чтобы все параметры были такими же, как у B. Нам нужно будет пойти на компромисс или корректировать некоторые атрибуты видео A, чтобы другие атрибуты видео A соответствовали видео B.
Вы делаете свой собственный анализатор.
Вы можете использовать ffmpeg (путь к ffmpeg — $exe) с pipe grep/sed/awk, чтобы извлечь информацию в переменные, использовать конструкции if-elif ($A — это путь к файлу A)
Вот пример для получения видеокодека, разрешения видео, частоты кадров и сброса так, чтобы не превышать 24 fps, и получения частоты аудиокодирования.
videoa=`$exe -i $A 2>&1 | grep Stream.*Video | sed -e 's/.*Video: //' -e 's/[, ].*//'`
if [ $videoa = "h264" ];then videob="-c:v libx264"
elif [ $videoa = "hevc" ];then videob="-c:v libx265"
fi
resolution=$($exe -i "$f" 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+')
crop="crop=960:544:0:2,"
if [ $(echo $($exe -i "$f" 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p") | awk '{printf "%.0f\n", $1}';) -gt 24 ];then r="-r 24";else r=""; fi
if [ $(echo $($exe -i "$f" 2>&1 | sed -n "s/.*, \(.*\) Hz.*/\1/p") | awk '{printf "%.0f\n", $1}';) -gt 44100 ];then af="-ar 44100";else af=""; fi
video="-map_chapters -1 -map_metadata -1 -vf ${crop}scale=${resolution},setsar=1/1,setdar=16/9 $videob -an $r"
$exe -y -ss $ss -i "$f" -t $t -map 0:v:0 $video $v
Ответ или решение
Преобразование видеофайлов и приведение одного видео в точно такой же формат, как другой, может быть довольно сложной задачей, особенно если учитывать различные параметры, такие как контейнер, видеокодек, аудиокодек, битрейт и размер. Этот процесс требует тщательного анализа и применения подходящих инструментов. Наиболее популярным инструментом для подобных задач является FFmpeg.
Процесс преобразования видео в тот же формат
-
Анализ видеофайлов: Первым шагом является анализ обоих видеофайлов (A и B) для определения всех необходимых параметров видео B. Используя FFmpeg, вы можете извлечь информацию о контейнере, кодеках, разрешении, битрейте и других параметрах.
-
Автоматизация извлечения параметров: FFmpeg предоставляет мощный интерфейс командной строки для вывода всей информации о файле, что помогает настроить параметры для видео A автоматически. Для автоматизации этого процесса можно использовать скрипты оболочки с grep, sed и awk, как показано в приведенном вами примере.
-
Преобразование видео A: После получения всех нужных параметров необходимо использовать FFmpeg для преобразования видео A с теми же параметрами, что и у видео B. Комбинация различных аргументов FFmpeg позволит достичь нужного результата, автоматизировав воспроизведение всех параметров.
Пример скрипта для использования FFmpeg
Вот как может выглядеть примерный скрипт для выполнения данной задачи (на основе вашего примера):
#!/bin/bash
# Пути к видеофайлам
A="path/to/videoA"
B="path/to/videoB"
# Извлечение кодека и разрешения видео B
video_codec=$(ffmpeg -i "$B" 2>&1 | grep Stream.*Video | sed -e 's/.*Video: //' -e 's/[, ].*//')
video_resolution=$(ffmpeg -i "$B" 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+')
# Получение других параметров: частота аудио, битрейт и т.д.
audio_sample_rate=$(ffmpeg -i "$B" 2>&1 | grep "Audio:" | sed -n "s/.*, \(.*\) Hz.*/\1/p")
# Установка параметров для преобразования видео A
if [ "$video_codec" = "h264" ]; then
video_codec_param="-c:v libx264"
elif [ "$video_codec" = "hevc" ]; then
video_codec_param="-c:v libx265"
fi
# Преобразование видео A
ffmpeg -i "$A" -vf "scale=$video_resolution" -ar "$audio_sample_rate" $video_codec_param "converted_video.mp4"
Важные моменты:
- Совместимость: Убедитесь, что все кодеки и контейнеры поддерживаются вашим оборудованием и программным обеспечением.
- Качество: Даже если все параметры совпадают, качество видео может различаться из-за особенностей исходного материала и особенностей кодеков.
- Оптимизация: Всегда проверяйте результат на пригодность и качество после преобразования.
Этот подход позволяет автоматически пересчитывать и применять ключевые параметры, избегая при этом ручного вмешательства. Преимущество FFmpeg — в его высокой гибкости и возможности автоматизации сложных задач преобразования медиа.
С использованием данной информации вам удастся создать собственный анализатор, что в долгосрочной перспективе будет более эффективным решением для массового преобразования видеофайлов.