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 — не полное говно, и ему совсем не нужно немного конкуренции, чтобы привести все в порядок.
                      • +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
                                                                                                                  

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