19 команд ffmpeg для любых нужд

http://www.catswhocode.com/blog/19-ffmpeg-commands-for-all-needs
  • Перевод
  • Tutorial
От переводчика:
Многие знают, что 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. ;)
Поделиться публикацией
Комментарии 107
    0
    Команды, конечно, интересные, но скажите, пожалуйста, как, например, при перекодировании видео задавать параметры кодека для итогового результата.
      +1
      В указанном в начале статьи мануале имеется перечисление всех доступных опций, Вам нужны секции Video Options и Advanced Video Options.
        0
        Да, гораздо интереснее было бы почитать про тонкие опции, как из приведенных примеров и пропущенные в пояснениях, так и из указанных секций.
      +3
      спасибо за статью, теперь я знаю как без всяких утилит перекодировать видео для iPad со своими кастомные настройками. Скачал несколько бесплатных, а там презаданные параметры и приходилось пользоваться ими
        0
        Без всяких утилит? :/
          0
          я имел ввиду GUI-утилит, где жесткие ограничения. У меня 16 гб, после прог, игр и музыки осталось мало места, а иногда в дорогу охото побольше фильмов закачать. Теперь же смогу сам варьировать размером видео файла
        +1
        Ребят, а как с помощью нее в видео файле переконвертировать формат аудио из ac3 в mp3?
        Стоит дома Т2 декодер и есть функция чтения фильмов с USB, но бида в том, что он не хочет воспринимать аудио ac3.

        Сейчас юзаю HandBrake, но он нереально все долго делает (близко 40 минут, на фильм в 1.5 гб).
          +1
          В принципе, должно сработать что-то типа этого:

          ffmpeg -i source_video.avi -acodec mp3 output_video.avi
          
            +6
            ffmpeg -i source_video.avi -acodec libmp3lame -vcodec copy output_video.avi
          +1
          ffmpeg deprecated. Следует перейти на avconv.
            0
            Перешли.

            Различия есть, но несущественные.
                0
                В любом случае я не зря обновил скрипты.

                function avconv () {
                    [ -n "$1" ] && echo `which $1` && exit
                    [ -n "`which avconv`" ] && echo `which avconv` || echo `which ffmpeg`
                }
                
                  0
                  Конструкция
                  echo `команда`
                  

                  внушает. Вы ее сознательно применили — у вас там что-то хитрое с путями?
                    0
                    У меня небольшая резервация в ~/.local/bin и .bashrc на стеройдах. Эта конструкция, возможно, однажды пригодится и не обременяет.

                    Хотя после ознакомления с происходящим вообще не вижу смысла в этом коде. Ничто не мешает использовать ffmpeg.
                      +3
                      Ну, сама по себе конструкция echo `команда` ничего осознанно хорошего не делает. В 99% случаев, это ровно то же, что написать просто команда, но:
                      • вариант с echo умеет падать, если команда выдаст слишком много данных
                      • вариант с echo преобразует все whitespace, по которым shell разделяет аргументы командной строки в одинарные пробелы
                      • вариант с echo умеет работать не так, как хочется, если shell не умеет backticks
                      • вариант с echo скрывая exit status команды, всегда возвращая exit status самого echo
                        0
                        Здесь echo выступает в роли return (ну или пытается).

                        #!/usr/bin/env bash
                        
                        function sum () {
                            echo $(( $1 + $2 ))
                        }
                        
                        sum 1 2 # 3
                        
                        var1=$(sum 3 4)
                        echo $var1 # 7
                        
                        
                +6
                Эти проекты развиваются паралленьно. Недавно наткнулись на ошибку при обработке файлов, что повторялась и в ffmpeg и в avconf из дистрибутива Убунты 12.10. Установка версии ffmpeg из git проблему решила. Лично для меня, разница между этими проектами неочевидна.
                  +1
                  Например habrahabr.ru/post/171225/
                    +12
                    Это чёрный пиар команды libav, которые форкнули ffmpeg, стали делать свою libav, поломали совместимость и написали, что ffmpeg deprecated — авось кто-нибудь и поверит. На самом деле ffmpeg продолжает жить своей жизнью, команды перекидыватся тухлыми помидорами, а у пользователей прибавилось проблем в связи с разрастанием зоопарка… :(
                      +1
                      Расскажите это тем, кто говорит что делать форки это круто: habrahabr.ru/post/169339/#comment_5870879
                        +2
                        Обычно, вилку (fork!) используют для еды. Но граф Орлов, как говорят злые языки, заколол ею Петра III. Означает ли это, что форки (вилки!) — это не круто? :)
                          +1
                          Так может и тут сделали для «еды»
                            0
                            Вполне возможно. Но на данный момент бардак разросся, появились несовместимости, а команды, помимо кидания друг в другм гнилыми помидорами, вводят в заблуждение пользователей (см сообщение про ffmpeg deprecated).
                            Как обычно, убивает не оружие…
                          –1
                          Вы так говорите, будто код ffmpeg — не полное говно, и ему совсем не нужно немного конкуренции, чтобы привести все в порядок.
                            0
                            Код ffmpeg божественен, особенно dsputils
                          +2
                          blog.pkh.me/p/13-the-ffmpeg-libav-situation.html — вот тут ситуация хорошо описана.
                          +3
                          Эта информация не верна. нужно понимать что произошел внутренний конфликт в команде.
                          Подробнее читать например здесь.
                          blog.pkh.me/p/13-the-ffmpeg-libav-situation.html
                          Обычно не комментирую подобные вещи, но в данной ситуации это плохая практика выдавать желаемое (личные побуждения) за действительное.
                          Это большая тема для обсуждения, и увы этот конфликт ни к чему хорошему пока не привел. Форкнув ffmpeg, avconv не создали лучший продукт.
                          –2
                          ну и ссылку на оригинал www.catswhocode.com/blog/19-ffmpeg-commands-for-all-needs
                            +8
                            Пост оформлен как перевод, ссылка на оригинал внизу поста.
                              +7
                              Прошу прощения, Вы правы
                            +5
                            3. Порезать видео на картинки

                            Существует гораздо более частый кейс — вырезать один кадр из видео для создания, например, превью на сайте или в админке.
                            На последнем проекте использовал такую команду:

                            ffmpeg -i "file.flv" -f image2 -vframes 1 -ss 00:00:02 "file_out.jpg"


                            Вырезает первый кадр второй секунды из файла file.flv и сохранить её в файле file_out.jpg.
                              +1
                              Как раз вырезать используя ffmpeg не рекомендую. Что бы вырезать кадр на определенной минуте/секунде он не может перейти только на этот кадр и обрабатывает кадры пока не дойдет до нужного "-ss 00:00:02". Если брать первые секунды то это не критично, но все равно лишнее ожидание/нагрузка/использование памяти.
                                +2
                                А чем лучше резать?
                                  +3
                                  mencoder
                                  Я например из видео делаю анимацию на 5 кадров. Мне нужно делать 5 кадров из разных частей видео. Раньше это делал ffmpeg. Создание такой анимации из фильма занимало более 30ти минут.
                                    0
                                    А ему можно указать заодно и качество JPEG? А то этот параметр в ffmpeg похоже захардкожен и явно не на высоте. :(
                                0
                                Это будет работать намного быстрее, если -ss переставить в начало:

                                ffmpeg -ss 00:00:02 -i "file.flv" -f image2 -vframes 1 "file_out.jpg"
                                  0
                                  Спасибо тебе добрый человек! Ты просто не представляешь как ты меня выручил. Как же я намучался не понимая почему одна картинка может генерироваться иногда целую минуту…
                                0
                                А можно с помощью этой утилиты перекодировать .wmv с кодеком g2m во что-нибудь более распространенное?
                                  +1
                                  Тут надо попробовать, готового ответа у меня нет.
                                    0
                                    Тут ситуция интересная, ffmpeg -codecs|grep -i g2m выдает этот кодек с пометкой "..V...". Это означает, что мы видим видеокодек без поддержки encoding/decoding (что довольно странно). Более того, это единственный кодек в ffmpeg с подобной пометкой! Надо изучать вопрос отдельно.
                                      0
                                      ffmpeg 2.7.2
                                      ffmpeg -codecs | grep g2m
                                      D.V.L. g2m                  Go2Meeting
                                      

                                      G2M4 поддерживается, я проверял.
                                      Для конвертации можно например написать ffmpeg -i input_g2m.wmv output.avi
                                      Если файл «проблемный», можно попробовать конвертировать по частям что получится с помощью -ss 00:01:25 (начало) -t 00:00:40 (продолжительность), а потом с помощью того же ffmpeg слить в один файл.
                                    +5
                                    Повернуть видео на 90°
                                    ffmpeg -vf transpose=1 -i file.avi file1.avi
                                      0
                                      По или против часовой?
                                        +2
                                        Опции transpose:
                                        0 — против часовой стрелки и зеркально;
                                        1 — по часовой стрелке;
                                        2 — против часовой стрелки;
                                        3 — по часовой стрелке и зеркально
                                          0
                                          в положительном направлении, скорей всего
                                          0
                                          Это, я так понимаю, не особо поможет с «синдромом вертикального видео», да?
                                            +2
                                            Очень даже поможет :)
                                              +3
                                              Ну поможет-то поможет, но видео может остаться вытянутым, так что смотря в каких случаях :)
                                          0
                                          Подскажите пожалуйста насчет конвертации нескольких картинок в видео.

                                          Как составить команду для создания слайдшоу, чтобы картинки сменяли друг друга через каждые n секунд. А то когда я разбирался, так и не понял как это сделать (уже не помню в чем проблема была).
                                            +2
                                            ffmpeg -r 1 -y -i "image_%010d.png" output.mpg
                                            

                                            И будет кадр в секунду. Параметр -r указывает нужный frame rate.
                                              0
                                              А меньше 1 можно? Чтобы допустим одна картинка на 10 секунд.

                                              И еще вопрос: каким получится видео, если картинки имеют разный размер?
                                                +2
                                                Можно ставить дробное: -r 0.1 даст кадр в 10 секунд.
                                                Если размер разный, ffmpeg будет ругаться. Поэтому сначала надо все картинки привести к одному размеру.
                                                  0
                                                  А еще вопрос: можно ли можно ли вместо «image_%010d.png» указывать просто несколько картинок?
                                                  Просто я сейчас указываю абсолютный путь в таком формате, а у меня ffmpeg пишет ошибку Invalid Argument. И такое впечатление что эта ошибка из-за пробела в абсолютном пути.
                                                    –1
                                                    Чтобы заставить консольную программу понимать пути с пробелами, можно сделать так:

                                                    FILES_PATH=My\ path\ with\ whitespaces
                                                    ffmpeg -r 1 -y -i "${FILES_PATH}/image_%010d.png" output.mpg
                                                    
                                            +4
                                            Вместо флага -b (битрейта) следует использовать: -b:v и -b:a — для видео и аудио соответственно.
                                              0
                                              а можно с помощью ffmpeg сконверитровать DVD диск в один mpeg файл без пережатия?
                                                0
                                                avidemux склеит вам vob файлы.
                                                0
                                                А есть ли у кого готовые опции для windows phone?
                                                  +2
                                                  Дополню ваш пост ссылкой на предыдущий аналогичный FFmpeg на каждый день
                                                    +2
                                                    Хм, а статья то изначально та же, только 14 пунктов расширили до 19.
                                                    +1
                                                    только вот -acodec aac не будет работать в большинстве билдов… На данный момент лучше говорить -acodec libvo_aacenc
                                                      +2
                                                      Склейка 2х и более видео в один.
                                                      Если ролики в одинаковых форматах с одинаковыми параметрами:
                                                      ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
                                                      

                                                      Если разные:
                                                      ffmpeg -i input1.mp4 -i input2.webm \
                                                      -filter_complex '[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [v] [a]' \
                                                      -map '[v]' -map '[a]' <encoding options> output.mkv
                                                      
                                                        +3
                                                        Ещё команды?

                                                        Вот вам захват видео с экрана:

                                                        ffmpeg -f x11grab -s cif -r 25 -i :0.0+10,20 /tmp/out.mpg

                                                        здесь -s cif — размер, 0.0 — экран, 10,20 — это смещение относительно верхнего левого угла экрана

                                                        при желании можно и звук, например, с alsa или jack присобачить
                                                          +3
                                                          Ватермарк:
                                                          ffmpeg -i in.mp4 -vfilters "movie=0:gif:logo.gif [logo]; [in][logo] overlay=10:mainH-overlayH-10:1 [out]" out.mp4
                                                          

                                                          Но тут все довольно сложно. Старые версии делали ватермарки через vhook, новые делают через libavfilter. Насколько помню за последний год его то включают то выключают из-за разных багов.
                                                            +3
                                                            Эх, кто бы подсказал команду:
                                                            Перепаковать .mkv в .mp4, причем:
                                                            — видео не переконвертировать, только перепаковать
                                                            — несколько аудио-дорожек из AC3 5.1 конвертировать в AAC 2.0
                                                            — по возможности добавить отдельно лежащий файл субтитров в .srt
                                                              +1
                                                              Я ниже такой же вопрос написал, не увидел вашего :) Присоединяюсь.

                                                              UPD: еще кстати было бы неплохо метаданные вперед помещать, чтобы можно было просматривать недоконверченный файл.
                                                                +2
                                                                Насчет конвертации без перекодирования видео было же буквально позавчера
                                                                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 и вписываем в него:
                                                                DirectShowSource("file.mkv", video=false)
                                                                multi_ch=ConvertAudioToFloat(last)
                                                                
                                                                function stereo_ch(clip a) {
                                                                	flr = GetChannel(a, 1, 2)
                                                                	fcc = GetChannel(a, 3)
                                                                	lfe = GetChannel(a, 4)
                                                                	lfc = MixAudio(fcc, lfe, 0.2071, 0.2071)
                                                                	mix = MergeChannels(lfc, lfc)
                                                                	lrc = MixAudio(flr, mix, 0.2929, 1.0)
                                                                	blr = GetChannel(a, 5, 6)
                                                                	return MixAudio(lrc, blr, 1.0, 0.2929)
                                                                }
                                                                
                                                                stereo_ch(multi_ch)
                                                                

                                                                после этого говорим

                                                                wavi "audio-from-mkv.avs" - | "d:\path\ffmpeg.exe" -y -i "file.mkv" -i pipe:0 -map 0:0 -map 1:0 -acodec libvo_aacenc -ab 192000 -vcodec copy -f mp4 result.mp4
                                                                

                                                                в результате в файл result.mp4 запишется первый трек из файла file.mkv (первым треком должно идти видео) и стерео звук сконвертированный из исходного 5.1 и закодированный в mp4 с битрейтом 192к

                                                                PS А вообще есть же GUI для ffmpeg? :)
                                                                  0
                                                                  но гуи только под мак…
                                                                    0
                                                                    2 первые дорожки из 5.1 на мой взгляд фигня получится.
                                                                    Я сейчас для этой задачи использую GUI Mkvtoolnix, Subler, Handbrake, возможно ещё что-то, — я в зоопарке инструментов немного путаюсь. Кто-то криво 5.1 в 2.0 перегоняет, кто-то не умеет mkv читать, вот и хочется один волшебный скрипт.
                                                                    P.S. Мак — не проблема, у меня это дефолтная система.
                                                                      0
                                                                      но через вави и ависинх как раз правильно же получается, а не первые 2 дорожки :)
                                                                        0
                                                                        Да, но это же Windows… :)
                                                                        Вообще, есть ещё вопросы с несколькими аудио-дорожками и субтитрами, но наверняка они решаемы. Может и заставлю себя для этих целей виртуалку запускать, спасибо.
                                                                    0
                                                                    Я делал так:
                                                                    1) Извлекаем все дорожки из .mkv
                                                                    2) Создаем .mp4 из .h264 который мы вытащили из .mkv
                                                                    3) AC3/DTS/FLAC > pcm -> aac (через fifo), тут зависит от формата, надо каналы мапить правильно итд
                                                                    4) Все субтитры вытаскиваем, перегоняем в .srt (ибо они в ass/ssa), потом запечатываем в .mp4
                                                                    5) Накладываем хинт дорожки на звук и видео, чтобы стримить проще было.

                                                                    Для всего этого у меня был большой perl скрипт который из одного файла делал сразу 3: iPad версия, AppleTV версия и «оригинал» в .mp4.
                                                                      0
                                                                      Я пятый пункт не понял. Это какая-то метаинформация в mp4 для эффективного беспроводного проигрывания видео, например из iTunes на iPad?
                                                                      Если у вас всю эту магию выполнял всего один скрипт, то это очень интересно. Я в идеале и хочу: сложил файлы в папку, запустил скрипт, через час готовые файлики .mp4.
                                                                        0
                                                                        Да это помогает лучше проигрывать файлы по сети.

                                                                        Проигрывает один фаил, но надо указывать какая дорожка за, что отвечает и какой кодек используется. И надо следить за процессом, а то бывает все ломается. По какой-то причине, если 3 пунк делать в один проход то получается рассинхрон.
                                                                    +1
                                                                    Может пригодится кому. Есть скрипт, который конвертирует звуковую дорожку из формата DTS (который часто присутствует в фильмах, но не может прочитаться современными телевизорами) в АС3 (который скушают телевизоры) — mkvdts2ac3, взять можно по этой ссылке:
                                                                    github.com/JakeWharton/mkvdts2ac3

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

                                                                      +1
                                                                      4. Конвертировать видео в формат iPod/iPhone

                                                                      Кто-нибудь может подсказать строчку для конвертации вместе со всеми звуковыми дорогами и субтитрами (по-моему видел такие видеофайлы для iDevice с вшитыми сабами)?
                                                                        +2
                                                                        Небольшое уточнение в п.1.
                                                                        Для получения информации следует использовать
                                                                        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
                                                                          0
                                                                          А вот подскажите как конвертировать MPEG 720x576 в AVI DV/PAL? Я даже строчку могу придумать, и даже пытался, но на выходе получил нечто совершенно неудобоваримое, особенно на быстром перемещении.

                                                                          Почему тот же Canopus Procoder на ура перекодирует на Windows, а вот на Linux какая-то хрень получается?
                                                                            +1
                                                                            Если кому-то нужно будет к существующему видеофайлу прицепить дополнительную аудиодорожку (и, возможно выкинуть часть существующих аудиодорожек), то я тут всё расписал (на английском правда): zoid.cc/ffmpeg-audio-video/
                                                                              +2
                                                                              Выдираем звук из видео в формате MP4 и сжимаем его в MP3:
                                                                              $ cat mp4tomp3.sh
                                                                              #!/bin/sh
                                                                              for file in "$@" ; do
                                                                              name=`echo "$file" | sed -e "s/.mp4$//g"`
                                                                              ffmpeg -i "$file" -ac 2 -f wav - | lame --preset standard - "$name.mp3"
                                                                              done
                                                                              

                                                                              Cкрипту года полтора; надо было быстро вынуть звук из видеозаписи мероприятия, сделанной на портативную видеокамеру, раздать его в виде файликов через болванки CD или флешки, в формате, который все могут прослушать, и вот: этот алгоритм спас. Похоже, был единичный случай его применения, но он был весьма полезный и своевременный. Взял вот отсюда, пост от January 26th, 2009, 11:26 PM.
                                                                                +2
                                                                                Спасибо, добрый человек! Очень выручил.
                                                                                Специально залогинился, чтобы сказать это (сорри, кармы не хватает отблагодарить по-другому).

                                                                                Остаётся добавить, что в официальных репозиториях Ubuntu LTS 14.04 (например), пакет FFmpeg отсутствует. Чтобы установить его (и обновлять в дальнейшем), можно подключить репозиторий, созданный разработчиком Jon Severinsson:

                                                                                sudo apt-add-repository ppa:jon-severinsson/ffmpeg
                                                                                sudo apt-get update
                                                                                sudo apt-get install ffmpeg
                                                                                


                                                                                Теперь можно запустить наш скрипт:

                                                                                mp4tomp3.sh *.mp4
                                                                                
                                                                                  +1
                                                                                  Пожалуйста; рад, что мой перепост решает чьи-то проблемы.
                                                                                  По поводу FFmpeg была новость, что оригинальный пакет вернётся в Ubuntu 15.04; но ведь можно (хотя бы ради спортивного интереса)) попробовать его имеющийся в основных репозиториях форк, т.е. libav.
                                                                                –1
                                                                                Подскажите, можно ли используя ffmpeg сжать уже готовый gif-анимацию?
                                                                                  0
                                                                                  Интересно, зачем на последнем пункте стоит ссылка на абсолютно бесполезную страницу? Более того — на ней иногда срабатывает «ахтунг, на Вашем компьютере обнаружены вирусы. Произвожу сканирование...».
                                                                                    0
                                                                                    Гуру, подскажите пожалуйста.
                                                                                    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.

                                                                                    От чего так?
                                                                                      0
                                                                                      Проблема достаточно странная, но обсуждаемая на зарубежных форумах у ffmpeg'а есть конкретное представление о входных параметрах и о параметрах того что должно получиться на выходе. Так, если Вы укажете -s 1280x1024 до -i — тоже получите желаемый результат захвата без растягивания.

                                                                                      т.е.
                                                                                      ffmpeg.exe -f dshow -s 1280x1024 -i video=«Philips SPC 1030NC Webcam» out.mp4
                                                                                      ffmpeg -f video4linux2 -s 1280x1024 -i /dev/video0 out.mp4
                                                                                      0
                                                                                      Всё бы хорошо, но есть такая плохая тенденция — смена формата параметров командной строки от версии к версии (свободное ПО, что вы хотите), т.о. новичок, желая приобщиться к утилитам такого рода должен мучаться, гугля желаемые параметры, а потом выясняя — чего же этому долбаному ffmpeg-у надо (ведь вывод об ошибках далеко не информативный)…

                                                                                      Своим не-IT-шным друзьям ставлю бесплатный freemake video converter. Жуёт всё во всё. И друзья по пустякам не звонят.
                                                                                        0
                                                                                        Спасибо за статью, как раз нужны некоторые вещи. Да и в коментах полно полезного материала :)
                                                                                        А вот видел формата 320 на 180 для айдевайсов и псп это как-то сурово. Это даже не 2007 год :)
                                                                                          0
                                                                                          pastebin.com/ZMXQwAQj — отказывается хабр размечать в сырец, вот так приятнее
                                                                                            0
                                                                                            Скринкаст:
                                                                                            alias recdesktop='ffmpeg -f x11grab -s 1920x1080 -r 8 -i :0.0 -sameq  -f alsa -i hw:1,0 '
                                                                                            
                                                                                              0
                                                                                              Захват одного кадра из rtsp потока
                                                                                              ./ffmpeg -threads 1 -i rtsp://1.1.1.1:554 -vframes 1 /var/www/test.com/blah.jpg
                                                                                              
                                                                                                0
                                                                                                Гуглил дико пару недель назад: искал, как добавить новую звуковую дорожку к уже существующему ролику, причем сделать это со сдвигом по времени (чуть позже) и понизив громкость оригинальной дорожки. Не раскопал. Подскажите, кто-нибудь? Было бы круто научиться озвучивать ролики без перекодирования.

                                                                                                Ну и сразу вопрос, вот оригинальная дорожка выведена почти в 0dB, новый звук в тоже. Что случится при смешении, звук будет искажен (будет клипиться как в последнем альбоме металлики) или «давайте жить дружно и тише» — сведен и деамплифицирован?
                                                                                                  +1
                                                                                                  Правильное превращение набора картинок в видео c аудио.

                                                                                                  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».
                                                                                                    +1
                                                                                                    Извиняюсь, в теге source по ошибке применено форматирование текста.
                                                                                                    Правильная команда выглядит так:

                                                                                                    ffmpeg -r a -i "image_%%03d.jpg" -t b -i "audio.mp3" -y -r c "output.mp4"
                                                                                                      0
                                                                                                      Также забыл добавить, что frame rate результирующего видео обычно равен 30.

                                                                                                      И если нужно сгенерировать таким способом видео из 3 картинок например, то входных картинок должно быть на самом деле 4, где первая и вторая будут повторяться (не знаю почему так, но именно так работает правильно).
                                                                                                        +2
                                                                                                        А кто знает почему виндовая версия не поддерживает -pattern_type glob (и далее например -i IMG*.jpg)? Каких там библиотек не хватает сигвиновских и компилировал кто-то с поддержкой всего этого?

                                                                                                        Кстати добавлю от себя особенность, с которой промучился несколько часов — последовательность файлов должна быть непрерывной, иначе ffmpeg прекращает их добавлять. И еще пару ключиков, которые очень полезные:

                                                                                                        -start_number 3378 -i IMG_%d.jpg

                                                                                                        -start_number_range 9999 -i IMG_%d.jpg
                                                                                                          0
                                                                                                          После долгого копания нашелся способ передать ffmpeg набор файлов с разными именами и за компанию выяснилось что вот такая комбинация НЕ работает — ffmpeg хавает файлы, но на выходе получается только один фрейм с первым, не знаю почему:

                                                                                                          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 для создания слайдшоу.
                                                                                                        +1
                                                                                                        Также, хотя и не совсем в тему, хотелось бы упомянуть как зациклить аудио (это может понадобиться для цели, упомянутой в комментарии выше). Это делается с помощью утилиты sox:

                                                                                                        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 означает линейную форму затухания. Также есть логарифмическая и другие (можно почитать в доках).
                                                                                                          0
                                                                                                          Кстати, может кто-нибудь знает возможно ли с помощью ffmpeg добавить эффекты перехода при генерации видео из набора картинок (fade, pixelate). И если возможно, то как?
                                                                                                            0
                                                                                                            >Конвертировать видео в формат iPod/iPhone
                                                                                                            >Конвертировать видео в формат PSP

                                                                                                            не работают «из коробки»…
                                                                                                              0
                                                                                                              Имеется дома камера Canon 1100D, которая пишет видео в формате .MOV с такими параметрами.

                                                                                                              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?
                                                                                                              Благодарю за ответы.
                                                                                                                0
                                                                                                                лучше всего использовать crf для видео. profile ставьте high. Но надо другие параметры вбить.
                                                                                                                aac лучший все же от гугла. Использовать vbr опять же лучше. Если интересно, то пишите в личку, научу.
                                                                                                                0
                                                                                                                Я сделяль скрипт!
                                                                                                                any2mp3.sh
                                                                                                                #!/bin/bash
                                                                                                                if [ "$#" -ne 6 ]; then
                                                                                                                	echo "Usage: any2mp3.sh [-i|--input] [INPUTPATH] [-e|--ext] [EXTENSION] [-o|--output] [OUTPUTPATH]"
                                                                                                                	exit -1
                                                                                                                fi
                                                                                                                while [[ $# > 1 ]]
                                                                                                                do
                                                                                                                key="$1"
                                                                                                                case $key in
                                                                                                                	-i|--input)
                                                                                                                	INPUTPATH="$2"
                                                                                                                	shift # past argument
                                                                                                                	;;
                                                                                                                	-e|--ext)
                                                                                                                	EXTENSION="$2"
                                                                                                                	shift # past argument
                                                                                                                	;;
                                                                                                                	-o|--output)
                                                                                                                	OUTPUTPATH="$2"
                                                                                                                	shift # past argument
                                                                                                                	;;
                                                                                                                	*)
                                                                                                                	# unknown option
                                                                                                                	;;
                                                                                                                esac
                                                                                                                shift # past argument or value
                                                                                                                done
                                                                                                                echo -------------------------------------------------------
                                                                                                                echo INPUTPATH  = "${INPUTPATH}"
                                                                                                                echo EXTENSION  = "${EXTENSION}"
                                                                                                                echo OUTPUTPATH = "${OUTPUTPATH}"
                                                                                                                echo -------------------------------------------------------
                                                                                                                echo "Number files in INPUTPATH with EXTENSION:" $(ls -1 "${INPUTPATH}"/*."${EXTENSION}" | wc -l)
                                                                                                                echo "ffmpeg -i " *.${EXTENSION} "-ar 44100 -ac 2 -aq 0 -f mp3 *.mp3"
                                                                                                                echo -------------------------------------------------------
                                                                                                                for a in "${INPUTPATH}"/*."${EXTENSION}"; do
                                                                                                                	MP3INFULL="${a[@]/%${EXTENSION}/mp3}"
                                                                                                                	MP3NAME="$(basename "${MP3INFULL}")"
                                                                                                                	MP3OUTFULL="${OUTPUTPATH}"/"${MP3NAME}"
                                                                                                                	echo "${a}" "==>" "${MP3OUTFULL}"
                                                                                                                done
                                                                                                                echo -------------------------------------------------------
                                                                                                                read -p "Press any key to continue. Ctrl-C to break... " -n1 -s
                                                                                                                echo
                                                                                                                for a in "${INPUTPATH}"/*."${EXTENSION}"; do
                                                                                                                	MP3INFULL="${a[@]/%${EXTENSION}/mp3}"
                                                                                                                	MP3NAME="$(basename "${MP3INFULL}")"
                                                                                                                	MP3OUTFULL="${OUTPUTPATH}"/"${MP3NAME}"
                                                                                                                	ffmpeg -i "${a}" -ar 44100 -ac 2 -aq 0 -f mp3 "${MP3OUTFULL}"
                                                                                                                done
                                                                                                                

                                                                                                                  0
                                                                                                                  Спасибо большое. Перегнал все stand-up шоу в mp3 чтобы слушать в автомобиле.
                                                                                                                  0
                                                                                                                  А как продлить длительность видео (последний кадр виден в конце)?
                                                                                                                    0
                                                                                                                    Конвертирование видео с несколькими аудиодорожками:

                                                                                                                    ffmpeg -i input.avi  -map 0:0 -map 0:1 -map 0:2 -vcodec h264 -b:v 800k -acodec:0 copy -acodec:1 copy output.avi
                                                                                                                    

                                                                                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                                                    Самое читаемое