Soft/FFmpeg: различия между версиями

Материал из ALT Linux Wiki
 
(не показано 45 промежуточных версий 4 участников)
Строка 1: Строка 1:
'''Avconv''' - библиотека для преобразования, воспроизведения, потоковой передачи и обработки аудио и видео.
[[en:FFmpeg commands]]
==Какой Avconv? Что с FFmpeg?==
{|class="wikitable" style="float: right; margin-left: 2em"
Если вы помните ранее везде использовался проект FFmpeg. Но что случилось, что теперь используют Avconv? Между разработчиками произошел конфликт и проект раскололся. Об этом рассказывает один из разработчиков в [http://blog.pkh.me/p/13-the-ffmpeg-libav-situation.html своем блоге]. [http://archive.is/OZVId (архив)] Но ничего страшного, для нас, обычных пользователей это все тот же FFmpeg, но с другим названием.
! colspan="2" | FFmpeg
|-
| colspan="2" | [[Изображение:User-menu-ffmpeg.png |64px|center]]
|-
| colspan="2" | [[Изображение: Ffmpeg-screen.png |300px|center|]]
|-
| '''Разработчик(и)'''
| Фабрис Беллар
|-
| '''Первый выпуск'''
| 2000
|-
| '''Лицензия'''
| LGPLv2.1+
|-
| '''Сайт'''
| [https://ffmpeg.org/ ffmpeg.org]
|}


==Для чего эта статья?==
'''FFmpeg''' - библиотека для преобразования, воспроизведения, потоковой передачи и обработки аудио и видео.
Когда я начал пользоваться Linux я искал различные GUI-утилиты для выполнения различных задач (установка программ, обновление системы, конвертация видео и пр.). Но, со временем мне показалось удобнее и практичнее выполнять их через консоль. Практически все конвертеры для Linux - оболочки для Avconv/FFmpeg. Но GUI либо ограничивает их возможность, либо (как в случае с WinFF) реализован в Альтах некорректно (профили работают криво и конвертация не идет). В данной статье я хотел бы рассмотреть использование Avconv в ALT Linux.
{{note|В P8 пакет и команда называются avconv, в P9 ffmpeg}}
==Avconv/FFmpeg==
Изначально был проект FFmpeg. Между разработчиками произошел конфликт, проект [https://www.heyiamindians.com/is-libav-dead/ раскололся] на два проекта FFmpeg и Libav (Avconv) - сторонники FFmpeg хотели сохранить скорость разработки в пользу большего количества функций, а сторонники Libav хотели улучшить состояние кода и уделить время разработке лучших API. Но на апрель 2020 года [https://web.archive.org/web/20200812182017/https://lists.libav.org/pipermail/libav-devel/2020-April/086589.html Avconv заброшен].
 
==Установка==
$ su -
# apt-get install ffmpeg


==Возможности==
==Возможности==
===Конвертирование видео===
===Конвертирование видео===
avconv -i '/run/media/petr/TRANSCEND/Видео/Мультфильмы/Малыш и Карлсон/2 Карлсон вернулся.avi' /home/petr/karlson.mp4


Где -i входной файл, а следующий путь выходной. Окончание выходного файла (avi, mp4, wmv)
====AVI====
ffmpeg -i "/run/media/input.mkv" "/home/output.avi"
ffmpeg -i "input.mkv" "output.avi" #Для работы с одним файлом в текущем каталоге.
====MP4====
ffmpeg -i "/run/media/input.mkv" "/home/output.mp4"
ffmpeg -i "input.mkv" "output.mp4" #Для работы с одним файлом в текущем каталоге.
====WMV====
ffmpeg -i "/run/media/input.mkv" "/home/output.wmv"
ffmpeg -i "input.mkv" "output.wmv" #Для работы с одним файлом в текущем каталоге.
====Webm в MP4====
ffmpeg -i "/run/media/input.mkv" "/home/output.mp4"
ffmpeg -i "input.mkv" "output.mp4" #Для работы с одним файлом в текущем каталоге.
 
===Изменить кодек звуковой дорожки, не затрагивая само видео===
[https://alt-gnome.wiki/ffmpeg.html#%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D0%BA%D0%BE%D0%B4%D0%B5%D0%BA-%D0%B7%D0%B2%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B8-%D0%B4%D0%BE%D1%80%D0%BE%D0%B6%D0%BA%D0%B8-%D0%BD%D0%B5-%D0%B7%D0%B0%D1%82%D1%80%D0%B0%D0%B3%D0%B8%D0%B2%D0%B0%D1%8F-%D1%81%D0%B0%D0%BC%D0%BE-%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE]
Ключ для копирования кодека аудио (-c:a copy) заменяется другим ключом: -c:a ac3
  ffmpeg -hide_banner -i "/run/media/input.mkv" -map 0:v:0 -map 0:a:0 -map 0:s:1 -c:v copy -c:a ac3 -c:s copy "/home/output.mp4"
 
===Конвертирование аудио===
ffmpeg -i "/run/media/input.mp3" "/home/output.ogg"
Где -i входной файл, а следующий путь выходной. Окончанием выходного файла может быть любой аудио-формат.
 
===Сжатие видео без потери качества===
ffmpeg -i "/run/media/input.mp4" -crf 18 -preset veryslow -c:a copy "/home/output.mp4"


Для aac нужно указать параметр -strict experimental.
crf 18 — переменный биттрейт. Если указать более низкий CRF, файл будет большего размера с лучшим визуальным качеством.
* 18 — часто считается сжатием «без визуальных потерь»
* 23 — считается стандартом.


Если вы кроме mp4 выберите другой формат, у вас из качественного видео получится зернистое. Почему, не знаю. Поэтому я использую mp4.
Какие пресеты скорости можно использовать: (Если не указать будет использоваться "-preset medium")
* -preset ultrafast:  Самый быстрый пресет, но с наихудшим качеством.
* -preset superfast:  Быстрый, но с небольшим снижением качества.
* -preset veryfast:  Быстрый, с небольшим снижением качества.
* -preset faster:  Быстрый, с небольшим снижением качества.
* -preset fast:  Достаточно быстрый, с небольшим снижением качества.
* -preset medium:  Средняя скорость, среднее качество.
* -preset slow:  Достаточно медленный, с улучшенным качеством.
* -preset slower:  Медленный, с хорошим качеством.
* -preset veryslow:  Самый медленный, но с наилучшим качеством.


===Конвертирование аудио===
===Сжатие видео без потери качества с аппаратным ускорением===  
avconv -i '/run/media/petr/Transcend/Документы/Музыка/Песни/Вадим Козин/Ленинград мой.mp3' /home/petr/leningrad.ogg
[https://alt-gnome.wiki/ffmpeg.html#%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BE%D1%80%D0%B8%D0%B3%D0%B8%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82%D0%B0-%D0%BF%D1%80%D0%B8-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8]
Где -i входной файл, а следующий путь выходной. Окончание выходного файла (mp3, wav, ogg, wma, aac, flac)
  ffmpeg -i "/run/media/input.mp4" -crf 18 -c:v h264_nvenc "/home/output.mp4" #Аппаратное ускорение NVIDIA NVENC
  ffmpeg -i "/run/media/input.mp4" -crf 18 -c:v h264_amf "/home/output.mp4" #Аппаратное ускорение AMD AMF
  ffmpeg -i "/run/media/input.mp4" -crf 18 -c:v h264_qsv "/home/output.mp4" #Аппаратное ускорение Intel Quick Sync Video


Для aac нужно указать параметр '''-strict experimental'''.
avconv -i '/run/media/petr/Transcend/Документы/Музыка/Песни/Вадим Козин/Ленинград мой.mp3' -strict experimental /home/petr/leningrad.aac
===Изменение разрешения видео===
===Изменение разрешения видео===
ffmpeg -i "/run/media/input.mkv" -s 320x240 "/home/output.mp4"
===Обрезка видео===
ffmpeg -i "/run/media/input.mkv" -t 00:05:00 -c copy "/home/output.mp4"
  ''-ss''
* Указывает начало отрезка видео, с которого начинается обработка.
  Например -ss 00:00:10  начнет обработку с 10-й секунды видео.
  ''-t''
* Указывает длительность отрезка видео, который будет обработан.
* Например, -t 00:00:30 будет обрабатывать первые 30 секунд видео.
  ''-ss 0:07:27 -t 0:00:07''
* Используя эти две опции совместно можно вырезать нужный отрезок видео или звука.
  ''-c copy''
* Копирование видео, аудио и субтитров без конвертирования.
===Извлечение аудиодорожки===
===Извлечение аудиодорожки===
Например, я хочу нарезать звуков из Карлсона типа "Так это вы таскали мои плюшки?!" или "Фу, как не культурно!". Я беру мультик, avi, и применяю следующую команду:
ffmpeg -i "/run/media/input.mkv" -vn -c:a copy "/home/output.aac"
avconv -i '/run/media/petr/TRANSCEND/Видео/Мультфильмы/Малыш и Карлсон/2 Карлсон вернулся.avi' /home/petr/karlson.mp3
#-vn игнорирует видео
Получаю mp3-файл, аудиодорожку из мультфильма, открываю Audacity и вырезаю нужные моменты.
#-c:a copy копирует аудио без перекодирования
 
===Изменение структуры контейнера видео файла без изменения качества видео===
[https://alt-gnome.wiki/ffmpeg.html#%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B8%D0%BD%D0%B5%D1%80%D0%B0-%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%84%D0%B0%D0%B8%D0%BB%D0%B0-%D0%B1%D0%B5%D0%B7-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0-%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE]
Допустим, у нас есть видеофайл с 5 аудио дорожками и 3 дорожками субтитров, а нам необходимо видео конкретно с первой аудио дорожкой и вторым потоком субтитров.
  ffmpeg -hide_banner -i "/run/media/input.mkv" -map 0:v:0 -map 0:a:0 -map 0:s:1 -c:v copy -c:a copy -c:s copy "/home/output.mkv"
* Выбираем первую видео дорожку: -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.''


Хотя, если хотите, можно сделать это сразу. С помощью ключей -ss (начало) и -t (продолжительность) можно вырезать конкретную фразу.
===Конвертация видео в изображения===
  avconv -ss 0:07:27 -t 0:00:07 -i '/run/media/petr/TRANSCEND/Видео/Мультфильмы/Малыш и Карлсон/2 Карлсон вернулся.avi' /home/petr/karlson.mp3
Например, мне нужны кадры "Кузи" с 4 минуты в течении 16 секунд:<br>
Так мы получим фразу "Убедительно просим увести ваших детей от наших голубых экранов."
1.Создайте каталог для картинок
mkdir ~ images
2.Переведите видео в изображения
  ffmpeg -ss 0:04:00 -t 0:00:16 -i "/run/media/petr/TRANSCEND/Видео/Мультфильмы/Домовенок Кузя/1 Приключения домовенка.avi" -vf fps=10 /home/petr/images/kuzya%03d.png


===Создание GIF из видео===
===Создание GIF из видео===
====Часть I====
1.Создайте каталог для временных картинок
1.Создайте каталог для временных картинок
  ~mkdir /frames
  mkdir ~ frames
2. Сконвертируйте видео на маленькое разрешение и вырежьте приблизительный кусок (-ss - начало видео, -t - продолжительность.)<br>
2. Сконвертируйте видео на маленькое разрешение и вырежьте приблизительный кусок (-ss - начало видео, -t - продолжительность.)<br>
  avconv -ss 0:04:00 -t 0:00:16 -i "/run/media/petr/TRANSCEND/Видео/Ч_б мультфильмы/Советские 1920-е/Одна из многих (1927).mp4" -strict experimental -vf scale=320:240 /home/petr/ffout.mp4
  ffmpeg -ss 0:04:00 -t 0:00:16 -i "/run/media/petr/TRANSCEND/Видео/Ч_б мультфильмы/Советские 1920-е/Одна из многих (1927).mp4" -strict experimental -vf scale=320:240 /home/petr/ffout.mp4
3.Переведите видео в изображения
3.Переведите видео в изображения
  avconv -i "/home/petr/ffout.mp4" -vf fps=10 /home/petr/frames/ffout%03d.png
  ffmpeg -i "/home/petr/ffout.mp4" -vf fps=10 /home/petr/frames/ffout%03d.png
Данная команда сконверитрует видео в изображения.<br>
Данная команда сконверитрует видео в изображения.<br>
3.Перейдите в папку и если надо, удалите лишние кадры.<br>
4.Перейдите в папку и если надо, удалите лишние кадры.<br>
4.Создайте gif:
====Часть II====
  convert -loop 0 frames/ffout0*.png chaplin.gif
*[[ImageMagick - обработка изображений#Часть II|С помощью ImageMagick]]
У меня получилась [https://www.dropbox.com/s/bhpjsp506drhjji/chaplin.gif?dl=0 такая GIF-ка].
 
===Пакетное конвертирование===
Предположим, вам нужно сконвертировать все видео *avi, *.mkv, *.mp4 и *.mov в каталоге с определенными параметрами.
 
Для этого создадим в текстовом редакторе следующий скрипт (где выделено жирным, вставьте нужные вам параметры):
  #!/bin/sh
mkdir conv
for f in *.avi; do
    ffmpeg -i "$f" '''-acodec copy -strict experimental -s 1280x720''' conv/"${f%.*}".'''mkv'''
done
for f in *.m{p4,kv,ov}; do
    ffmpeg -i "$f" '''-acodec copy -strict experimental -s 1280x720''' conv/"${f%.*}".'''mkv'''
done
Сохраним его как '''conv.sh''' и сделаем исполняемым:
chmod +x conv.sh
Переходим в каталог с файлами и выполняем данный скрипт.[https://forum.ubuntu.ru/index.php?topic=248799.msg1964419#msg1964419]
 


======
{{Category navigation|title=Софт в ALT Linux|category=Soft|sortkey={{SUBPAGENAME}}}}
[[Категория:Soft]]
[[Категория:CookBook]]

Текущая версия от 15:13, 10 июля 2024

FFmpeg
User-menu-ffmpeg.png
Ffmpeg-screen.png
Разработчик(и) Фабрис Беллар
Первый выпуск 2000
Лицензия LGPLv2.1+
Сайт ffmpeg.org

FFmpeg - библиотека для преобразования, воспроизведения, потоковой передачи и обработки аудио и видео.

Примечание: В P8 пакет и команда называются avconv, в P9 ffmpeg

Avconv/FFmpeg

Изначально был проект FFmpeg. Между разработчиками произошел конфликт, проект раскололся на два проекта FFmpeg и Libav (Avconv) - сторонники FFmpeg хотели сохранить скорость разработки в пользу большего количества функций, а сторонники Libav хотели улучшить состояние кода и уделить время разработке лучших API. Но на апрель 2020 года Avconv заброшен.

Установка

$ su -
# apt-get install ffmpeg

Возможности

Конвертирование видео

AVI

ffmpeg -i "/run/media/input.mkv" "/home/output.avi"
ffmpeg -i "input.mkv" "output.avi" #Для работы с одним файлом в текущем каталоге.

MP4

ffmpeg -i "/run/media/input.mkv" "/home/output.mp4"
ffmpeg -i "input.mkv" "output.mp4" #Для работы с одним файлом в текущем каталоге.

WMV

ffmpeg -i "/run/media/input.mkv" "/home/output.wmv"
ffmpeg -i "input.mkv" "output.wmv" #Для работы с одним файлом в текущем каталоге.

Webm в MP4

ffmpeg -i "/run/media/input.mkv" "/home/output.mp4"
ffmpeg -i "input.mkv" "output.mp4" #Для работы с одним файлом в текущем каталоге.

Изменить кодек звуковой дорожки, не затрагивая само видео

[1] Ключ для копирования кодека аудио (-c:a copy) заменяется другим ключом: -c:a ac3

 ffmpeg -hide_banner -i "/run/media/input.mkv" -map 0:v:0 -map 0:a:0 -map 0:s:1 -c:v copy -c:a ac3 -c:s copy "/home/output.mp4"

Конвертирование аудио

ffmpeg -i "/run/media/input.mp3" "/home/output.ogg"

Где -i входной файл, а следующий путь выходной. Окончанием выходного файла может быть любой аудио-формат.

Сжатие видео без потери качества

ffmpeg -i "/run/media/input.mp4" -crf 18 -preset veryslow -c:a copy "/home/output.mp4"

crf 18 — переменный биттрейт. Если указать более низкий CRF, файл будет большего размера с лучшим визуальным качеством.

  • 18 — часто считается сжатием «без визуальных потерь»
  • 23 — считается стандартом.

Какие пресеты скорости можно использовать: (Если не указать будет использоваться "-preset medium")

  • -preset ultrafast: Самый быстрый пресет, но с наихудшим качеством.
  • -preset superfast: Быстрый, но с небольшим снижением качества.
  • -preset veryfast: Быстрый, с небольшим снижением качества.
  • -preset faster: Быстрый, с небольшим снижением качества.
  • -preset fast: Достаточно быстрый, с небольшим снижением качества.
  • -preset medium: Средняя скорость, среднее качество.
  • -preset slow: Достаточно медленный, с улучшенным качеством.
  • -preset slower: Медленный, с хорошим качеством.
  • -preset veryslow: Самый медленный, но с наилучшим качеством.

Сжатие видео без потери качества с аппаратным ускорением

[2]

 ffmpeg -i "/run/media/input.mp4" -crf 18 -c:v h264_nvenc "/home/output.mp4" #Аппаратное ускорение NVIDIA NVENC
 ffmpeg -i "/run/media/input.mp4" -crf 18 -c:v h264_amf "/home/output.mp4" #Аппаратное ускорение AMD AMF
 ffmpeg -i "/run/media/input.mp4" -crf 18 -c:v h264_qsv "/home/output.mp4" #Аппаратное ускорение Intel Quick Sync Video

Изменение разрешения видео

ffmpeg -i "/run/media/input.mkv" -s 320x240 "/home/output.mp4"

Обрезка видео

ffmpeg -i "/run/media/input.mkv" -t 00:05:00 -c copy "/home/output.mp4"
 -ss
  • Указывает начало отрезка видео, с которого начинается обработка.
 Например -ss 00:00:10  начнет обработку с 10-й секунды видео.
 -t
  • Указывает длительность отрезка видео, который будет обработан.
  • Например, -t 00:00:30 будет обрабатывать первые 30 секунд видео.
 -ss 0:07:27 -t 0:00:07
  • Используя эти две опции совместно можно вырезать нужный отрезок видео или звука.
 -c copy
  • Копирование видео, аудио и субтитров без конвертирования.

Извлечение аудиодорожки

ffmpeg -i "/run/media/input.mkv" -vn -c:a copy "/home/output.aac"
  1. -vn игнорирует видео
  2. -c:a copy копирует аудио без перекодирования

Изменение структуры контейнера видео файла без изменения качества видео

[3] Допустим, у нас есть видеофайл с 5 аудио дорожками и 3 дорожками субтитров, а нам необходимо видео конкретно с первой аудио дорожкой и вторым потоком субтитров.

 ffmpeg -hide_banner -i "/run/media/input.mkv" -map 0:v:0 -map 0:a:0 -map 0:s:1 -c:v copy -c:a copy -c:s copy "/home/output.mkv"
  • Выбираем первую видео дорожку: -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.

Конвертация видео в изображения

Например, мне нужны кадры "Кузи" с 4 минуты в течении 16 секунд:
1.Создайте каталог для картинок

mkdir ~ images

2.Переведите видео в изображения

ffmpeg -ss 0:04:00 -t 0:00:16 -i "/run/media/petr/TRANSCEND/Видео/Мультфильмы/Домовенок Кузя/1 Приключения домовенка.avi" -vf fps=10 /home/petr/images/kuzya%03d.png

Создание GIF из видео

Часть I

1.Создайте каталог для временных картинок

mkdir ~ frames

2. Сконвертируйте видео на маленькое разрешение и вырежьте приблизительный кусок (-ss - начало видео, -t - продолжительность.)

ffmpeg -ss 0:04:00 -t 0:00:16 -i "/run/media/petr/TRANSCEND/Видео/Ч_б мультфильмы/Советские 1920-е/Одна из многих (1927).mp4" -strict experimental -vf scale=320:240 /home/petr/ffout.mp4

3.Переведите видео в изображения

ffmpeg -i "/home/petr/ffout.mp4" -vf fps=10 /home/petr/frames/ffout%03d.png

Данная команда сконверитрует видео в изображения.
4.Перейдите в папку и если надо, удалите лишние кадры.

Часть II

Пакетное конвертирование

Предположим, вам нужно сконвертировать все видео *avi, *.mkv, *.mp4 и *.mov в каталоге с определенными параметрами.

Для этого создадим в текстовом редакторе следующий скрипт (где выделено жирным, вставьте нужные вам параметры):

#!/bin/sh
mkdir conv
for f in *.avi; do
    ffmpeg -i "$f" -acodec copy -strict experimental -s 1280x720 conv/"${f%.*}".mkv
done
for f in *.m{p4,kv,ov}; do
    ffmpeg -i "$f" -acodec copy -strict experimental -s 1280x720 conv/"${f%.*}".mkv
done

Сохраним его как conv.sh и сделаем исполняемым:

chmod +x conv.sh

Переходим в каталог с файлами и выполняем данный скрипт.[4]