добавить звук
ffmpeg -i in2.mp4 -i audio.mp3 -codec copy -shortest output.mp4
---
От переводчика:
Многие знают, что ffmpeg — это сила, но не все знают, какая именно. Он многогранен и безграничен, а его man объёмен и местами малопонятен, лишь немногие постигли дао профессиональной работы с ним. И тем не менее, этот инструмент может быть полезен почти всем, кто хоть иногда работает с видео и звуком, даже на бытовом уровне. О некоторых полезных консольных командах ffmpeg и пойдёт речь в статье. В некоторых местах я взял на себя смелость вставить ссылки на поясняющие статьи.
ffmpeg — это кроссплатформенная open-source библиотека для обработки видео- и аудиофайлов. Я собрал 19 полезных и удивительных команд, покрывающих почти все нужды: конвертация видео, извлечение звуковой дорожки, конвертирование для iPod или PSP, и многое другое.
1. Получение информации о видеофайле
ffmpeg -i video.avi
2. Превратить набор картинок в видео
ffmpeg -f image2 -i image%d.jpg video.mpg
Эта команда преобразует все картинки из текущей директории (названные image1.jpg, image2.jpg и т.д.) в видеофайл video.mpg
(примечание переводчика: мне больше нравится такой формат:
ffmpeg -r 12 -y -i "image_%010d.png" output.mpg
здесь задаётся frame rate (12) для видео, формат «image_%010d.png» означает, что картинки будут искаться в виде image_0000000001.png, image_0000000002.png и тд, то есть, в формате printf)
3. Порезать видео на картинки
ffmpeg -i video.mpg image%d.jpg
Эта команда создаст файлы image1.jpg, image2.jpg и т.д., поддерживаются так же форматы PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI.
4. Конвертировать видео в формат iPod/iPhone
ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4
Пояснения:
- Источник: source_video.avi
- Аудио кодек: aac
- Битрейт аудио: 128kb/s
- Видео кодек: mpeg4
- Битрейт видео: 1200kb/s
- Размер видео: 320 на 180 пикселей
- Полученное видео: final_video.mp4
5. Конвертировать видео в формат PSP
ffmpeg -i source_video.avi -b 300 -s 320x240 -vcodec xvid -ab 32 -ar 24000 -acodec aac final_video.mp4
Пояснения:
- Источник: source_video.avi
- Аудио кодек: aac
- Битрейт аудио: 32kb/s
- Видео кодек: xvid
- Битрейт видео: 1200kb/s
- Размер видео: 320 на 180 пикселей
- Полученное видео: final_video.mp4
6. Извлечь звуковую дорожку из видео и сохранить в mp3
ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192K -f mp3 sound.mp3
Пояснения:
- Источник: source_video.avi
- Битрейт аудио: 192kb/s
- Выходной формат: mp3
- Полученный аудиофайл: sound.mp3
7. Конвертировать wav в mp3
ffmpeg -i son_origine.wav -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3
8. Конвертировать .avi в .mpg
ffmpeg -i video_origine.avi video_finale.mpg
9. Конвертировать .mpg в .avi
ffmpeg -i video_origine.mpg video_finale.avi
10. Конвертировать .avi в .gif (без сжатия)
ffmpeg -i video_origine.avi gif_anime.gif
11. Добавить звук к видео
ffmpeg -i son.wav -i video_origine.avi video_finale.mpg
12. Конвертировать .avi в .flv
ffmpeg -i video_origine.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_finale.flv
13. Конвертировать .avi в .dv
ffmpeg -i video_origine.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 video_finale.dv
или
ffmpeg -i video_origine.avi -target pal-dv video_finale.dv
14. Конвертировать .avi в mpeg для DVD-плееров
ffmpeg -i source_video.avi -target pal-dvd -ps 2000000000 -aspect 16:9 finale_video.mpeg
Пояснения:
- Выходной формат: pal-dvd
- Максимальный размер для выходного файла: 2000000000 (2 Gb)
- Широкоэкранный формат: 16:9
15. Сжать .avi в DivX
ffmpeg -i video_origine.avi -s 320x240 -vcodec msmpeg4v2 video_finale.avi
16. Сжать OGG Theora в mpeg DVD
ffmpeg -i film_sortie_cinelerra.ogm -s 720x576 -vcodec mpeg2video -acodec mp3 film_termin.mpg
17. Сжать .avi в SVCD mpeg2
Формат NTSC:
ffmpeg -i video_origine.avi -target ntsc-svcd video_finale.mpg
Формат PAL:
ffmpeg -i video_origine.avi -target pal-svcd video_finale.mpg
18. Сжать .avi в VCD mpeg2
Формат NTSC:
ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg
Формат PAL:
ffmpeg -i video_origine.avi -target pal-vcd video_finale.mpg
19. Многопроходное кодирование с помощью ffmpeg
ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2
Примечание переводчика:
Предлагаю в комментариях привести и другие полезные команды ffmpeg, их ведь гораздо больше, чем 19. ;)
- TechTrain прибывает на IT-платформу
Картинки
Стоит дома Т2 декодер и есть функция чтения фильмов с USB, но бида в том, что он не хочет воспринимать аудио ac3.
Сейчас юзаю HandBrake, но он нереально все долго делает (близко 40 минут, на фильм в 1.5 гб).
Различия есть, но несущественные.
внушает. Вы ее сознательно применили — у вас там что-то хитрое с путями?
~/.local/bin
и.bashrc
на стеройдах. Эта конструкция, возможно, однажды пригодится и не обременяет.Хотя после ознакомления с происходящим вообще не вижу смысла в этом коде. Ничто не мешает использовать ffmpeg.
echo `команда`
ничего осознанно хорошего не делает. В 99% случаев, это ровно то же, что написать простокоманда
, но:echo
выступает в ролиreturn
(ну или пытается).Как обычно, убивает не оружие…
Подробнее читать например здесь.
blog.pkh.me/p/13-the-ffmpeg-libav-situation.html
Обычно не комментирую подобные вещи, но в данной ситуации это плохая практика выдавать желаемое (личные побуждения) за действительное.
Это большая тема для обсуждения, и увы этот конфликт ни к чему хорошему пока не привел. Форкнув ffmpeg, avconv не создали лучший продукт.
Существует гораздо более частый кейс — вырезать один кадр из видео для создания, например, превью на сайте или в админке.
На последнем проекте использовал такую команду:
Вырезает первый кадр второй секунды из файла
file.flv
и сохранить её в файлеfile_out.jpg
.Я например из видео делаю анимацию на 5 кадров. Мне нужно делать 5 кадров из разных частей видео. Раньше это делал ffmpeg. Создание такой анимации из фильма занимало более 30ти минут.
G2M4 поддерживается, я проверял.
Для конвертации можно например написать ffmpeg -i input_g2m.wmv output.avi
Если файл «проблемный», можно попробовать конвертировать по частям что получится с помощью -ss 00:01:25 (начало) -t 00:00:40 (продолжительность), а потом с помощью того же ffmpeg слить в один файл.
ffmpeg -vf transpose=1 -i file.avi file1.avi
0 — против часовой стрелки и зеркально;
1 — по часовой стрелке;
2 — против часовой стрелки;
3 — по часовой стрелке и зеркально
Как составить команду для создания слайдшоу, чтобы картинки сменяли друг друга через каждые n секунд. А то когда я разбирался, так и не понял как это сделать (уже не помню в чем проблема была).
И будет кадр в секунду. Параметр -r указывает нужный frame rate.
И еще вопрос: каким получится видео, если картинки имеют разный размер?
Если размер разный, ffmpeg будет ругаться. Поэтому сначала надо все картинки привести к одному размеру.
Просто я сейчас указываю абсолютный путь в таком формате, а у меня ffmpeg пишет ошибку Invalid Argument. И такое впечатление что эта ошибка из-за пробела в абсолютном пути.
Если ролики в одинаковых форматах с одинаковыми параметрами:
Если разные:
Вот вам захват видео с экрана:
ffmpeg -f x11grab -s cif -r 25 -i :0.0+10,20 /tmp/out.mpg
здесь -s cif — размер, 0.0 — экран, 10,20 — это смещение относительно верхнего левого угла экрана
при желании можно и звук, например, с alsa или jack присобачить
Но тут все довольно сложно. Старые версии делали ватермарки через vhook, новые делают через libavfilter. Насколько помню за последний год его то включают то выключают из-за разных багов.
Перепаковать .mkv в .mp4, причем:
— видео не переконвертировать, только перепаковать
— несколько аудио-дорожек из AC3 5.1 конвертировать в AAC 2.0
— по возможности добавить отдельно лежащий файл субтитров в .srt
UPD: еще кстати было бы неплохо метаданные вперед помещать, чтобы можно было просматривать недоконверченный файл.
habrahabr.ru/post/170557/#comment_5931101
Насчет звука печальнее — 5.1 в 2.0 ffmзeg не умеет пока. Но можно взять только 2 первые дорожки из 5.1 звука с помощью опции
-ac 2
в некоторых билдах ее указывать нужно только после битрейта. Но лучше использовать для этого AviSynth и wavi. Там для доунмикса есть стандартная функция
Предположим у нас есть mkv файл c видео дорожкой и DTS звуком 5.1:
В папкy с mkv копируем wavi.exe, создаем там же файл audio-from-mkv.avs и вписываем в него:
после этого говорим
в результате в файл result.mp4 запишется первый трек из файла file.mkv (первым треком должно идти видео) и стерео звук сконвертированный из исходного 5.1 и закодированный в mp4 с битрейтом 192к
PS А вообще есть же GUI для ffmpeg? :)
Я сейчас для этой задачи использую GUI Mkvtoolnix, Subler, Handbrake, возможно ещё что-то, — я в зоопарке инструментов немного путаюсь. Кто-то криво 5.1 в 2.0 перегоняет, кто-то не умеет mkv читать, вот и хочется один волшебный скрипт.
P.S. Мак — не проблема, у меня это дефолтная система.
Вообще, есть ещё вопросы с несколькими аудио-дорожками и субтитрами, но наверняка они решаемы. Может и заставлю себя для этих целей виртуалку запускать, спасибо.
1) Извлекаем все дорожки из .mkv
2) Создаем .mp4 из .h264 который мы вытащили из .mkv
3) AC3/DTS/FLAC > pcm -> aac (через fifo), тут зависит от формата, надо каналы мапить правильно итд
4) Все субтитры вытаскиваем, перегоняем в .srt (ибо они в ass/ssa), потом запечатываем в .mp4
5) Накладываем хинт дорожки на звук и видео, чтобы стримить проще было.
Для всего этого у меня был большой perl скрипт который из одного файла делал сразу 3: iPad версия, AppleTV версия и «оригинал» в .mp4.
Если у вас всю эту магию выполнял всего один скрипт, то это очень интересно. Я в идеале и хочу: сложил файлы в папку, запустил скрипт, через час готовые файлики .mp4.
Проигрывает один фаил, но надо указывать какая дорожка за, что отвечает и какой кодек используется. И надо следить за процессом, а то бывает все ломается. По какой-то причине, если 3 пунк делать в один проход то получается рассинхрон.
github.com/JakeWharton/mkvdts2ac3
Перепаковывется быстро, около 5 минут, телевизоры воспроизводят такой звук без проблем.
Кто-нибудь может подсказать строчку для конвертации вместе со всеми звуковыми дорогами и субтитрами (по-моему видел такие видеофайлы для iDevice с вшитыми сабами)?
Для получения информации следует использовать
ffprobe video.avi
Так же ffprobe поддерживает несколько форматов для вывода информации ini, json, xml
ffprobe -v 0 video.avi -print_format json -show_format
ffprobe -v 0 video.avi -print_format xml -show_format
ffprobe -v 0 video.avi -print_format ini -show_format
Почему тот же Canopus Procoder на ура перекодирует на Windows, а вот на Linux какая-то хрень получается?
$ cat mp4tomp3.sh
Cкрипту года полтора; надо было быстро вынуть звук из видеозаписи мероприятия, сделанной на портативную видеокамеру, раздать его в виде файликов через болванки CD или флешки, в формате, который все могут прослушать, и вот: этот алгоритм спас. Похоже, был единичный случай его применения, но он был весьма полезный и своевременный. Взял вот отсюда, пост от January 26th, 2009, 11:26 PM.
Специально залогинился, чтобы сказать это (сорри, кармы не хватает отблагодарить по-другому).
Остаётся добавить, что в официальных репозиториях Ubuntu LTS 14.04 (например), пакет FFmpeg отсутствует. Чтобы установить его (и обновлять в дальнейшем), можно подключить репозиторий, созданный разработчиком Jon Severinsson:
Теперь можно запустить наш скрипт:
По поводу FFmpeg была новость, что оригинальный пакет вернётся в Ubuntu 15.04; но ведь можно (хотя бы ради спортивного интереса)) попробовать его имеющийся в основных репозиториях форк, т.е. libav.
ffmpeg.exe -f dshow -i video=«Philips SPC 1030NC Webcam» -s 1280x1024 out.mp4
Делает захват в разрешении 640*480 растянутом до 1280*1024, а вот
ffplay.exe -f dshow -i video=«Philips SPC 1030NC Webcam» -s 1280x1024
Захватывает в честном 1280*1024.
От чего так?
т.е.
ffmpeg.exe -f dshow -s 1280x1024 -i video=«Philips SPC 1030NC Webcam» out.mp4
ffmpeg -f video4linux2 -s 1280x1024 -i /dev/video0 out.mp4
Своим не-IT-шным друзьям ставлю бесплатный freemake video converter. Жуёт всё во всё. И друзья по пустякам не звонят.
А вот видел формата 320 на 180 для айдевайсов и псп это как-то сурово. Это даже не 2007 год :)
Ну и сразу вопрос, вот оригинальная дорожка выведена почти в 0dB, новый звук в тоже. Что случится при смешении, звук будет искажен (будет клипиться как в последнем альбоме металлики) или «давайте жить дружно и тише» — сведен и деамплифицирован?
ffmpeg -r a -i "image_%<b>%</b>03d.jpg" -t b -i "audio.mp3" -y -r c "output.mp4"
a — frame rate, количество изображений в секунду. Если это значение < 1, то нужно обязательноуказывать -r c, чтобы выходное видео получилось корректным и воспринималось всеми стандартными плеерами.
b — продолжительность звучания аудио. В моем случае указывается продолжительность видео, чтобы аудио не вылезло за границы. Узнать продолжительность можно с помощью ffprobe, а в данном случае она равна n / a, где n — количество входных изображений.
c — frame rate результирующего видео.
Обратите внимание, что в Win системах во всяком случае, входные изображения нужно указывать с двойным процентом. Если аудио не нужно, то соответственно уберите -t b -i «audio.mp3».
Правильная команда выглядит так:
ffmpeg -r a -i "image_%%03d.jpg" -t b -i "audio.mp3" -y -r c "output.mp4"
И если нужно сгенерировать таким способом видео из 3 картинок например, то входных картинок должно быть на самом деле 4, где первая и вторая будут повторяться (не знаю почему так, но именно так работает правильно).
Кстати добавлю от себя особенность, с которой промучился несколько часов — последовательность файлов должна быть непрерывной, иначе ffmpeg прекращает их добавлять. И еще пару ключиков, которые очень полезные:
-start_number 3378 -i IMG_%d.jpg
-start_number_range 9999 -i IMG_%d.jpg
ffmpeg -r 1 -i IMG_3378.jpg -i IMG_3380.jpg -i IMG_3382.jpg -c:v mpeg4 -vtag xvid -f avi -y out.avi
а вот такая (конвеер) работает:
type IMG_3378.jpg IMG_3380.jpg IMG_3382.jpg | ffmpeg -r 3 -f image2pipe -r 1 -y -vcodec mjpeg -i — out.avi
и да, файлы должны быть кажется одинаковые по ширине и высоте, т.е. вертикальные и горизонтальные картинки нужно сделать одного размера (напр. 800х800). Я использовал irfan batch converter -> canvas size для пакетной обработки файлов. Хотя, если обработки в bat файле не нужно, можно использовать например ImagesToVideo — обертка вокруг ffmpeg для создания слайдшоу.
sox -e ima-adpcm "input.mp3" "output.mp3" repeat n
n — количество повторов — 1.
А вот так сделать fade аудио:
sox "input.mp3" "output.mp3" fade t a b
a — продолжительность fade in / fade out.
b — секунда, в которой громкость должна уменьшиться до 0. Обычно это конец аудио
Параметр t означает линейную форму затухания. Также есть логарифмическая и другие (можно почитать в доках).
>Конвертировать видео в формат PSP
не работают «из коробки»…
video :: MPEG-4 | QuickTime | Advanced Video Codec | Baseline@L5.0 | 26,3 Мбит/сек | 1280x720
audio :: PCM | 768 Кбит/сек | mono | 48,0 КГц | 16 бит
В таком виде хранить домашнее видео накладно, хотелось бы перекодировать покомпактней. Имеется Windows 7, жать собрался в 2 прохода.
ffmpeg -y -i in.mov -c:v libx264 -preset medium -b:v 4500k -pix_fmt yuvj420p -pass 1 -an -f mp4 nul
ffmpeg -y -i in.mov -c:v libx264 -preset medium -b:v 4500k -pix_fmt yuvj420p -pass 2 -c:a libfaac -b:a 256k -f mp4 out.mp4
Хотелось бы спросить советов у сообщества. Обеспечит ли такой подход качественное пережатие или есть более лучшие варианты?
Чем лучше из libfaac, libvo_aacenc, NeroAACCodec жать аудиодорогу? Смотреть ли на альтернативы: avconv, mencoder?
Благодарю за ответы.
aac лучший все же от гугла. Использовать vbr опять же лучше. Если интересно, то пишите в личку, научу.
any2mp3.sh