- Лицензия
- LGPL v2.1+
- Сайт проекта
- ffmpeg.org
- Сообщить о проблеме
- trac.ffmpeg.org
FFMPEG
FFmpeg — утилита для Linux, для обработки мультимедийного контента, такого как аудио, видео, субтитры и связанные с ними метаданные.
Установка из репозитория
FFmpeg можно установить через терминал:
su -
apt-get update
apt-get install ffmpeg
epm -i ffpmeg
Получите информацию о медиафайле
Отображение информации о медиафайле, введите:
ffmpeg -i file_name
Получить информацию можно, как для аудио, так и для видео файлов:
ffmpeg -i video_file.mp4
ffmpeg -i audio_file.mp3
Для получения краткой информации, воспользуйтесь -hide_banner
, введите:
ffmpeg -i video_file.mp4 -hide_banner
ffmpeg -i audio_file.mp3 -hide_banner
Конвертируйте медиафайлы
Конвертируйте различные мультимедийными форматами. Вам нужно только указать входные и выходные файлы, поскольку ffmpeg получит требуемый формат из расширений файлов. Это работает для преобразования видео в видео и аудио в аудио.
Примеры:
ffmpeg -i "video_input.mp4" "video_output.avi"
ffmpeg -i "video_input.webm" "video_output.flv"
ffmpeg -i "audio_input.mp3" "audio_output.ogg"
ffmpeg -i "audio_input.wav" "audio_output.flac"
Ознакомится со всем списком всех поддерживаемых форматов, используйте:
ffmpeg -formats
Измените разрешение видео или соотношение сторон
Еще одна простая задача для ffmpeg. Все, что вам нужно сделать, чтобы изменить размер видео, - это указать новое разрешение после флага `-s``:
ffmpeg -i "Файл.avi" -s 1024x576 "Файл.mp4"
Обрезка видео без перекодирования
К примеру первые 45 минут вырезать из видео:
ffmpeg -i "Видео.mkv" -ss 00:45:00 -c copy "Видео2.mkv"
Обрезать видео с определенного времени до определенного времени:
ffmpeg -i "Видео.mkv" -ss 00:45:00 -to 1:55:00 -c copy "Видео2.mkv"
Сохранение оригинальности качества контента при кодировании.
Укажите параметр -qscale 0
перед выходным файлом, чтобы сохранить качество видеофайла:
ffmpeg -hide_banner -i "Файл.avi" -qscale 0 "Файл.mp4"
Подсказка
Опция -qscale 0 стремится к сохранению качества не только видео но так же и аудио дорожки.
В данном примере приведён аналог опции -qscale 0
в котором мы извлекаем битрейт с помощью которого пытаемся сохранить оригинальность качества контента:
bitrate=$(ffmpeg -hide_banner -i "Файл.avi" 2>&1 | grep -oP 'bitrate: \K[0-9]+');
ffmpeg -hide_banner -i "Файл.avi" -c:v libx264 -b:v ${bitrate}k -c:a copy "/путь/куда/сохранить/Файл.mkv"
Подсказка
Обратите внимание что нужно указать нужный файл для кодирования в первой и второй строчке.
Индентичная процедура, но для всех файлов в каталоге:
for i in *.mp4; do ffmpeg -hide_banner -i "$i" -qscale 0 "/путь/к/каталогу/${i%.*}.mkv"; done
В данной команде мы используем кодек x264
для кодирования:
for i in *.mkv; do
bitrate=$(ffmpeg -hide_banner -i "$i" 2>&1 | grep -oP 'bitrate: \K[0-9]+')
ffmpeg -hide_banner -i "$i" -map 0:v:0 -map 0:a:0 -c:v libx264 -b:v ${bitrate}k -c:a copy "/путь/к/существующей/директории/где/сохранить/итоговые/файлы/${i%.*}.mkv";
done
Информация
Использовать аппаратное ускорение видеокарты. Отредактируйте строчку -c:v libx264
NVIDIA NVENC -c:v h264_nvenc
AMD AMF -c:v h264_amf
Intel Quick Sync Video -c:v h264_qsv
Подсказка
Тут указываем что в данном каталоге мы берём для кодирования все файлы с нужным расширением: for i in *.mkv;
for i in *.avi;
for i in *.mp4;
И так далее Так же можно указать без расширения что по итогу затроен абсолютно все файлы в каталоге не зависимо от их расширения for i in *;
Изменение структуры контейнера видео-файла без изменения качества видео
Допустим у нас есть видео файл с 5 аудио дорожками и многочисленным количеством субтитров, а нам необходимо видео конкретно с первой аудио дорожкой и вторыми по порядку субтитрами. -map 0:v:0
тут выделяем первую видео дорожку. -map 0:a:0
тут указываем что нужна только первая аудио-дорожка. -map 0:s:1
тут указываем что нужны только вторые по порядку субтитры:
Подсказка
Порядок начинается не с 1 а с 0, будьте внимательны
ffmpeg -hide_banner -i "файл.mkv" -map 0:v:0 -map 0:a:0 -map 0:s:1 -c:v copy -c:a copy -c:s copy "/путь/к/файлу/куда/сохранить/файл.mkv"
Изменить формат звуквой дорожки не затрагивая видео кодек. Возьмём предыдущию команду в качестве примера.
ffmpeg -hide_banner -i "файл.mkv" -map 0:v:0 -map 0:a:0 -map 0:s:1 -c:v copy -c:a ac3 -c:s copy "/путь/к/файлу/куда/сохранить/файл.mkv"
Обьеденяет видео без перекодирования с расширением .mkv (текущий каталог) аудио с расширением .mka и субтитры с расширением .ass с одинаковыми названиями. Так же сохраняется оригинальность названия и расширения видео-файлов.
Предположим что у вас есть сериал в котором находятся серии и два каталога с нужным аудио-переводом и субтитрами. (Все изначальные расширения в команде вы можете изменить под свои):
for i in *.mkv;
do
ffmpeg -hide_banner -i "$i" -i "/Путь/к/аудио/файлам/${i%.*}.mka" -i "/Путь/к/субтитрам/${i%.*}.ass" -map 0:v:0 -map 1:a -map 2:s -c:v copy -c:a copy -c:s copy "/Путь/куда/сохранить/${i}";
done
Подсказка
Справка по сокращению опций -c:v copy
-c:a copy
-c:s copy
Вы можете сократить написание этих опций на одну -c copy
которая обьеденяет все три опции. Но учтите если вы хотите сделать к примеру видео без субтитров вам следует прописать нужные опции -c:v copy
-c:a copy
и не прописывать -c:s copy
Информация
Справка по обозначению опций -map 0:v:0
-map 0:a:0
-map 0:s:0
Изменять -map 0:v:0 не рекомендуется так как видео файлы могут содержать в себе определённые обложки и программа за основу может взять не само видео а обложку (картинку)
Изменяя -map 0:a:0 мы выбираем какую аудио дорожку скопировать (-map 0:a:0 первая по порядку, -map 0:a:1 вторая, -map 0:a:2 третья и так далее)
Изменяя -map 0:s:0 принцип схож с аудио дорожками (-map 0:s:0 первая по порядку, -map 0:s:1 вторая, -map 0:s:2 третья и так далее)
Вывод названия аудио кодека, количество каналов аудио, язык и название аудио дорожки.
for file in *; do
echo "Файл: $file"
ffprobe -v error -select_streams a -show_entries stream=codec_name,channels,tags:stream_tags=language,title -of csv=p=0 "$file"
done
Информация
Общая информация к каждой из команд. Вы можете указать название файлов без путей к ним но тогда вам нужно в терминале перейти в каталог где лежит изначальный файл. Так же можно указать полные пути к примеру ffmpeg -i "/путь/к/файлу/видео.mp4" "/путь/куда/сохранить/видео2.avi"
Работа с GIF
Конвертировать видео с расширением .mp4 в GIF
ffmpeg -i "файл.mp4" "файл.gif"
Конвертируем .mp4 видео с FPS 3 кадра и масштабированием 320 по ширине (по высоте само подстроится):
ffmpeg -i "видео.mp4" -vf "fps=3,scale=320:-1:flags=lanczos" "гифка.gif"
Делаем анимацию GIF в 2 раза медленеее. Редактируя опцию setpts=PTS*2 мы настраиваем скорость анимации:
ffmpeg -i "гиф.gif" -filter_complex "setpts=PTS*2" "гифка.gif"
Разбиение GIF на отдельные кадры:
ffmpeg -i "гиф.gif" "гифка_%04d.png"
Разбиение GIF на отдельные кадры но самостоятельно регулируем количеством редактируя значение fps=10:
ffmpeg -i "гиф.gif" -vf "fps=10" "гифка_%04d.png"
Обьеденяем изображения в GIF но необходимо их переименовать и пронумеровать чтобы это выглядело так: гифка_0001.png гифка_0002.png гифка_0003.png и так далее:
ffmpeg -i "гифка_%04d.png" -vf "fps=10" "гиф.gif"
Добавление текста внизу по центру:
ffmpeg -i гиф.gif -vf "drawtext=text='ALT Gnome Wiki':x=(w-text_w)/2:y=main_h-text_h-10:fontsize=24:fontcolor=white" текст.gif
Как загрузить короткое видео без звука в Telegram чтобы оно сохранилось как видео а не конвертировалось в GIF:
ffmpeg -i "файл.mp4" -f lavfi -i anullsrc -c:v copy -c:a aac -shortest "файл2.mp4"