- Лицензия
- LGPL v2.1+
- Сайт проекта
- ffmpeg.org
- Сообщить о проблеме
- trac.ffmpeg.org
FFmpeg
FFmpeg — Linux-утилита для обработки аудио- и видеоконтента, субтитров и связанные с ними метаданные.
Установка из репозитория
FFmpeg можно установить через терминал:
su -
apt-get update
apt-get install ffmpeg
epm -i ffmpeg
Краткая сводка об опциях
Указать входной файл
ffmpeg -i
Ознакомится со всем списком всех поддерживаемых форматов, используйте:
ffmpeg -formats
Скрыть баннер об информации самой программы FFmpeg в выводе
ffmpeg -hide_banner
Получите информацию о медиафайле
1. ffmpeg -i input_file.mp4
2. ffmpeg -i /home/input_file.mp4
В примере присутствуют два способа:
- Вы находитесь в текущем каталоге где лежит данный файл.
- Вы указывается полный путь к файлу.
Независимо от расширения файла информация о медиафайле отобразится.
Конвертация медиафайлов
Конвертируйте различные мультимедийными форматами. Для этого можно просто указать имена файлов, поскольку 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"
Подсказка
Ниже примеры, где можно сделать перебор всех файлов в текущем каталоге, что по итогу затронет абсолютно все файлы независимо от их расширения. Вместо for i in *.mkv;
пропишите for i in *;
Изменение разрешения или соотношение сторон для видео
Ещё одна простая задача для FFmpeg. Всё, что нужно сделать, чтобы изменить размер видео, - указать новое разрешение, использовав флаг s
Флаг -c copy
используется для сохранения оригинального качества (Простым языком перепаковка из одного контейнера в другой внося при этом изменения)
ffmpeg -i "Файл.avi" -s 1024x576 -c copy "Файл1.avi"
for i in *.mkv; do ffmpeg -hide_banner -i "$i" -s 1024x576 -c copy "/mnt/Hard/Итог/${i}"; done
Обрезка видео без перекодирования
К примеру, можно вырезать первые 45 минут из видео:
ffmpeg -i "Видео.mkv" -ss 00:45:00 -c copy "Видео2.mkv"
for i in *.mkv; do ffmpeg -hide_banner -i "$i" -ss 00:45:00 -c copy "/mnt/Hard/Итог/${i}"; done
Обрезать видео с определённого времени до определённого времени:
ffmpeg -i "Видео.mkv" -ss 00:45:00 -to 1:55:00 -c copy "Видео2.mkv"
for i in *.mkv; do ffmpeg -hide_banner -i "$i" -ss 00:45:00 -to 1:55:00 -c copy "/mnt/Hard/Итог/${i}"; done
Сохранение оригинального качества контента при кодировании
Существует несколько опций, с которыми можно приблизится к оригиналу:
-qscale 0
— постоянный битрейт. Если нужно параллельно обработать этой опцией аудио, нужно отдельно указывать-q:a
или-aq q
, так как по умолчанию обрабатывается только видеокодек.-crf 18
— переменный битрейт. Если указать более низкий CRF, файл будет большего размера с лучшим визуальным качеством.18
— часто считается сжатием «без визуальных потерь»23
— считается стандартом.
Внимание
В поддержке FFmpeg часто можно встретить упоминание что -qscale
плохо работает с H.264
ffmpeg -hide_banner -i "Файл.avi" -qscale 0 "Файл.mp4"
ffmpeg -hide_banner -i "Файл.avi" -crf 18 "Файл.mp4"
for i in *.mkv; do ffmpeg -hide_banner -i "$i" -qscale 0 "/mnt/Hard/Итог/${i}"; done
for i in *.mkv; do ffmpeg -hide_banner -i "$i" -crf 18 "/mnt/Hard/Итог/${i}"; done
Рукописный скрипт извлекает битрейт видео из входного файла, чтобы сохранить исходное качество при конвертации.
for i in *; 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 "/mnt/Hard/Итог/${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
Изменение структуры контейнера видеофайла без изменения качества видео
Допустим, у нас есть видеофайл с 5 аудиодорожками и 3 дорожками субтитров, а нам необходимо видео конкретно с первой аудиодорожкой и вторым потоком субтитров.
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"
for i in *.mkv; do ffmpeg -hide_banner -i "$i" -map 0:v:0 -map 0:a:0 -map 0:s:1 -c:v copy -c:a copy -c:s copy "/путь/к/файлу/куда/сохранить/${i}"; done
- Выбираем первую видеодорожку:
-map 0:v:0
- Выбираем первую аудиодорожку:
-map 0:a:0
- Выбираем второй поток субтитров:
-map 0:s:1
- Применение
-c copy
равносильно указанию-c:v copy -c:a copy -c:s copy
, если ранее были выбраны нужные дорожки.
Будьте внимательны
Индексация дорожек начинается с нуля, поэтому первая дорожка будет иметь номер 0
, а не 1
.
Изменить кодек звуковой дорожки, не затрагивая само видео.
Ключ для копирования кодека аудио (-c:a copy
) заменяется другим ключом: -c:a ac3
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"
for i in *.mkv; do ffmpeg -hide_banner -i "$i" -map 0:v:0 -map 0:a:0 -map 0:s:1 -c:v copy -c:a ac3 -c:s copy "/путь/к/файлу/куда/сохранить/${i}"; done
Объединяем видео без перекодирования с расширением .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 copy \
"/Путь/к/итогу/${i%.*}.mkv"
done
for i in *.mkv; do
ffmpeg -hide_banner -i "$i" \
-i "/Путь/к/аудио/${i%.*}.mka" \
-map 0:v:0 -map 1:a \
-c copy \
"/Путь/к/итогу/${i%.*}.mkv"
done
Вывод названия аудиокодека, количества каналов аудио, языка и названия аудиодорожки.
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
Полезный поиск по ключевым словам в мета-данных медиафайла.
Информация
Для указания параметра поиска, измените строчку "Stream\|Audio\|Subtitle"
, \|
— оператор «или».
for file in *; do
if [[ -f "$file" ]]; then
echo "$file"
ffmpeg -i "$file" 2>&1 | grep "Stream\|Audio\|Subtitle"
fi
done
Работа с GIF
Конвертация видео с расширением MP4 в GIF
ffmpeg -i "файл.mp4" "файл.gif"
Конвертация MP4 с 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
и так далее
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"