воскресенье, 13 августа 2017 г.

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

От переводчика:
Многие знают, что 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. ;)

16 коммент.:

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

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

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

    ОтветитьУдалить
  2. Ватермарк:
    ffmpeg -i in.mp4 -vfilters "movie=0:gif:logo.gif [logo]; [in][logo] overlay=10:mainH-overlayH-10:1 [out]" out.mp4

    ОтветитьУдалить
  3. Предположим у нас есть 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к

    ОтветитьУдалить
  4. Выдираем звук из видео в формате 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 или флешки, в формате, который все могут прослушать, и вот: этот алгоритм спас.

    ОтветитьУдалить
  5. Add sound tracks to a video file with FFmpeg
    December 2, 2012
    Short tutorial how to extract & merge audio tracks from/to video files with FFmpeg.

    Extracting audio track(s) from video file

    Say, we have a video file and we need to extract specific audio track from it. First, let's see which audio tracks we have in this file. Run the following command:

    ffmpeg -i
    Look at the output and find strings starting with "Stream #":

    Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x304 [SAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
    Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), s16, 448 kb/s
    Let's extract audio track (stream 0:1):

    ffmpeg -i -map 0:1 -vn -acodec copy output.ac3
    Adding multiple audio tracks to existing video file

    Say, we have existing video file with single audio track, and we want to merge two more audio tracks to this video file.

    Here is final command:

    ffmpeg -i -i -i -map 0:0 -map 0:1 -map 1:0 -map 2:0 -c:v copy -c:a copy
    Let's see what's happening here.

    first we pass 3 source files, each with -i
    then comes 4 -map parameters. Each consecutive map parameter adds another stream to output file. After -map we specify from where to take the stream. First number means number of input file (which we specified earlier with -i), and second number means number of stream inside this input file. So, here we tell exactly the following (remember files and streams are indexed from zero):
    map 0:0: copy stream 0 from first file (this is video stream) to stream 0 of output file
    map 0:1: copy stream 1 from first file (this is audio stream) to stream 1 of output file
    map 1:0: copy stream 0 from second file to stream 2 of output file
    map 2:0: copy stream 0 from third file to stream 3 of output file
    c:v copy means "Copy all video streams without re-encoding"
    c:a copy means "Copy all audio streams without re-encoding"
    That's it!

    ОтветитьУдалить
  6. Поскольку я много лет занимался звуком: сведением, написанием фонограмм и записью (хотя судьба распорядилась так, что этим больше не занимаюсь), поделюсь опытом. Не брезговал и изготовлением рекламных роликов, посему с записью голоса дело приходилось иметь не раз.

    1. Микрофон. Микрофон можно использовать самый простой: от звуковой карты a la Sound Blaster, если переделать его питание. В нём применён достаточно неплохой капсуль, но его нужно запитать более высоким напряжением. Инфу об этом можно найти в сети. Если намерения более серьёзные, можно купить б/у студийный микрофон начального уровня Shure SM57. Хоть его можно и найти б/у за $50, это не означает, что он — барахло. Через такой в своё время писался вокалист Aerosmith. Просто каждому вокалисту своё микрофон.

    2. Процесс записи. Исходный материал должен быть максимально чистым. Звук кулера — враг номер один записи на микрофон. Чтобы от него избавиться, проще всего использовать для записи ноутбук. :) Чтобы избавиться от эха, прежде всего можно повесить тряпку сзади себя, т.к. микрофон воспринимает больше всего звук с той же стороны где сидит говорящий. Второй очень популярный домашний вариант — забраться в платяной шкаф, а текст заранее закачать на смартфон и читать с него. В шкафу нет эха и звук получается очень качественный. Заодно и от шума кулера избавитесь. По поводу очистки шума: если уж он у вас записался, постарайтесь найти плагин Steinberg Denoiser. Он очень старинный, но умеет убирать фоновый шум без искажения звукового материала.

    3. Обработка звука. Прочитав статью, увидел, что вы упустили один из базовых моментов звукорежиссуры: обработку компрессором. Компрессор — это приблуда №1, которая выравнивает уровень громкости звуковой дорожки. В Sound Forge есть встроенные компрессоры. Как им работать, тоже почитайте в сети, статей великое множество. Но для начала выберите пресет Speech и начните понижать движок threshold. Вы услышите, что громкость начнёт падать, но при этом звук станет более чётким, агрессивным и начнёт звучать намного профессиональнее. Ещё для удаления излишне шипящих и сипящих звуков используется плагин DeEsser. После этих двух плагинов на голос можно наложить очень небольшой ревер (Reverb), но это уже по вкусу.

    4. Микширование. Эффекта приглушения основной фонограммы можно было добиться используя sidechain. Это фишка, которая позволяет громкости одного трека управлять любым параметром любого плагина другого трека, она есть во многих звуковых редакторах (не знаю есть ли в Vegas). Или второй вариант: поставить компрессор на всю фонограмму. Получилось бы, что когда вашего голоса нет, основная фанера громче, а как ваш голос появляется (т.к. общая громкость становится больше!) компрессор приглушает всю фанеру и на фоне этого основная фанера станет тише. Только в параметрах этого компрессора надо поставить большое время атаки и затухания чтобы это происходило плавно. На выходе всей фонограммы обычно ещё применяют и Limiter: он позволяет максимизировать громкость не внося искажений.

    Ну и ещё совет. :) Если вдруг захотите заняться профессиональной озвучкой, в качестве голосовых моделей лучше использовать актёров театров. У них как правило поставленные голоса, они умеют правильно произносить слова и могут сыграть любую нужную вам интонацию. Времени у них свободного много, а платить им можно (в силу невысокой оплаты их труда) не много, особенно молодым. На работу они будут соглашаться с радостью.

    По софту. Есть очень старая программа CoolEdit, которую потом купил Adobe и выпустил её под названием Adobe Audition. При том, что ей уже много лет, её любят многие звукорежиссёры в силу удобства использования и очень неплохих плагинов. И шумоподавитель там тоже очень зачётный. При этом она вам заменит и Sound Forge и Vegas вместе взятые, т.к. тоже имеет мультитрек.

    ОтветитьУдалить
  7. Скринкаст:
    alias recdesktop='ffmpeg -f x11grab -s 1920x1080 -r 8 -i :0.0 -sameq -f alsa -i hw:1,0 '

    ОтветитьУдалить
  8. Правильное превращение набора картинок в видео c аудио.

    ffmpeg -r a -i "image_%%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».

    ОтветитьУдалить
  9. Извиняюсь, в теге source по ошибке применено форматирование текста.
    Правильная команда выглядит так:

    ffmpeg -r a -i "image_%%03d.jpg" -t b -i "audio.mp3" -y -r c "output.mp

    ОтветитьУдалить
  10. Также забыл добавить, что frame rate результирующего видео обычно равен 30.

    И если нужно сгенерировать таким способом видео из 3 картинок например, то входных картинок должно быть на самом деле 4, где первая и вторая будут повторяться (не знаю почему так, но именно так работает правильно).

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

    -start_number 3378 -i IMG_%d.jpg

    -start_number_range 9999 -i IMG_%d.jpg

    ОтветитьУдалить
  12. После долгого копания нашелся способ передать 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 для создания слайдшоу.

    ОтветитьУдалить
  13. f your video does not show the frames correctly If you encounter problems, such as the first image is skipped or only shows for one frame, then use the ​fps video filter instead of -r for the output framerate
    ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4
    Alternatively the ​format video filter can be added to the ​filterchain to replace -pix_fmt yuv420p like "fps=25,format=yuv420p". The advantage to this method is that you can control which filter goes first
    ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4
    I tested below parameters, it worked for me

    "e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4
    below parameters also worked but it always skips the first image

    "e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4
    making video from images placed in different folders

    First add image paths to imagepaths.txt like below.


    # this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

    file 'E:\images\png\images__%3d.jpg'
    file 'E:\images\jpg\images__%3d.jpg'
    Sample usage as follow;


    "h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

    ОтветитьУдалить
  14. Using ffmpeg to convert a set of images into a video
    Apr 5, 2016

    Original 2012-11-16, Updated 2016-04-05: cleanup and information about overlaying images.

    When using ffmpeg to compress a video, I recommend using the libx264 codec, from experience it has given me excellent quality for small video sizes. I have noticed that different versions of ffmpeg will produce different output file sizes, so your mileage may vary.

    To take a list of images that are padded with zeros (pic0001.png, pic0002.png…. etc) use the following command:

    ffmpeg -r 60 -f image2 -s 1920x1080 -i pic%04d.png -vcodec libx264 -crf 25 -pix_fmt yuv420p test.mp4
    where the %04d means that zeros will be padded until the length of the string is 4 i.e 0001…0020…0030…2000 and so on. If no padding is needed use something similar to pic%d.png or %d.png.

    -r is the framerate (fps)
    -crf is the quality, lower means better quality, 15-25 is usually good
    -s is the resolution
    -pix_fmt yuv420p specifies the pixel format, change this as needed
    the file will be output (in this case) to: test.mp4

    Specifying start and end frames
    ffmpeg -r 60 -f image2 -s 1920x1080 -start_number 1 -i pic%04d.png -vframes 1000 -vcodec libx264 -crf 25 -pix_fmt yuv420p test.mp4
    -start_number specifies what image to start at
    -vframes 1000 specifies the number frames/images in the video
    Overlaying image on video
    Assuming that you have an overlay image that is the same size as the video, you can use the following command to add it during the ffmpeg compression process.

    ffmpeg -r 60 -f image2 -s 1920x1080 -i pic%04d.png -i ~/path_to_overlay.png -filter_complex "[0:v][1:v] overlay=0:0" -vcodec libx264 -crf 25 -pix_fmt yuv420p test_overlay.mp4
    ~/path_to_overlay.png is the full/relative path to the overlay image
    [0:v][1:v] joins the two video streams together, stream 1 is the set of images, stream 2 is the overlay file
    overlay=0:0 specifies the position of the overlay, in this case the overlay image is assumed to be the same size as the video so no offset is needed. The offset is specified as overlay=x:y where x is the x offset in pixels and y is the y offset in pixels
    You can use this technique to overlay multiple files on top of each other, or even have a dynamic overlay. -filter_complex is a really flexible command and can do much much more than is shown here. See the ffmpeg filters documentation for more information.

    Adding a mp3 to a video
    Adding sound to a video is straightforward

    ffmpeg -r 60 -f image2 -s 1280x720 -i pic%05d.png -i MP3FILE.mp3 -vcodec libx264 -b 4M -vpre normal -acodec copy OUTPUT.mp4
    -i MP3FILE.mp3 The audio filename
    -acodec copy Copies the audio from the input stream to the output stream
    Converting a video to mp4 from a different format
    If the video has already been compressed the following can be used to change the codmpression to h264:

    ffmpeg -i INPUT.avi -vcodec libx264 -crf 25 OUTPUT.mp4
    Playback Issues for Quicktime/Other Codecs
    Quicktime and some other codecs have trouble playing certain pixel formats such as 4:4:4 Planar and 4:2:2 Planar while 4:2:0 seems to work fine

    Add the following flag to force the pixel format:

    -pix_fmt yuv420p
    Finer Bitrate control (to control size and quality)
    -b 4M
    you can use the -b flag to specify the target bitrate, in this case it is 4 megabits per second

    Using -vpre with a setting file
    -vpre normal
    -vpre is the quality setting, better quality takes longer to encode, some alternatives are: default, normal, hq, max. Note that the -vpre command only works if the corresponding setting file is available.

    ОтветитьУдалить
  15. Конвертирование видео с несколькими аудиодорожками:

    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

    ОтветитьУдалить
  16. 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

    ОтветитьУдалить