Пишем свой FFMpeg видео конвертер

видео конвертация

Если задать в поиске video converter, то вы увидете множество платных и бесплатных конвертеров, большинство из которых используют в качестве ядра конвертирования именно FFMpeg, будто exe-шник или скомпилированная dll. Кстати, FreeSmartSoft.com совершенно не скрывает того факта, что мы используем ffmpeg.exe в своих продуктах: FSS Video Converter и FSS Audio Converter.

Итак, задача чётко определена - видео конвертер на основе FFMpeg.
Первое что нужно сделать - это скачать ffmpeg. Распакуйте скачанный архив. В папке bin вы найдёте ffmpeg.exe

 

Следует запомнить общее правило для формирования командной строки:

ffmpeg.exe [параметры входного файла] -i [входной файл] [опции конечного файла] [конечный файл]

Рассмотрим самый простой пример конвертатирования видео с настройкой 24 кадра в секунду:

ffmpeg.exe -i input.avi -r 24 output.avi

 

Основные параметры ffmpeg

Рассмотрим основные настройки аудио/видео - конвертации. Если какие-то из настроек не указаны, то FFmpeg установит их по умолчанию:

-i - задает имя файла-исходника.

-threads - число, определяющее количество ядер процессора, которые будут задействованы при конвертировании. Эта настройка сказывается на скорости кодирования. Для автоматического определения нужно установить 0.

-t - устанавливает длительность кодируемого видео в секундах. Можно использовать формат чч:мм:сс.

-ss - задаёт позицию в видеофайле с которой начнётся кодирование. Формат в целых секундах или чч:мм:сс.

-fs - число, задающее килобайты (k) или мегабайты (M). Важен регистр приставки. Очень полезная опция для кодирования небольших файлов.

-y - не забудьте про этот параметр, иначе результирующий файл не будет перезаписываться без подтверждения.

Видео опции:

-vcodec - установка видеокодека, с помощью которого будет кодироваться видеофайл (-vcodec mpeg4).

-vpre - предустановка для кодека.

-f - force, принудительно задаём формат конечного файла (-f mpeg).

-b - битрейт видеопотока. Дефолтное значение: 200kb/s (-b 1500).

-bt - задаёт битрейт. Дефолтное значение: 4000k. Если битрейт слишком занижен, то это существенно сказывается на качество.

-r - количество кадров в секунду. Дефолтное значение равно 25.

-s -разрешение конечного видеофайла. По умолчанию равен размеру исходника.

Возможные сокращения: svga(800x600), vga(640x480)

-aspect - значения, определяющие соотношение сторон результирующего видеофайла (-aspect 4:3 равнозначно -aspect 1.3333).

-croptop

-cropbottom

-cropleft

-cropright - обрезка кадров по направлениям: сверху, снизу, слева или справа. Значения задаются в пикселях. Нужная опция для удаления черных полос (-croptop 20).

Некоторые версии ffmpeg не поддерживают эту настройку, используя опцию -vf crop=width:height:x:y, подробное описание приведём ниже.

-pass - задаёт число проходов при кодировании, 1 или 2.

-deinterlace - опция для удаления "гребенки".

Аудио опции:

-ar - задаёт частоту дискретизации звука. Дефолтное значение: 44100Гц (-ar 22050).

-ab - задаёт битрейт звуковой дорожки. Дефолтное значение: 64kb (-ab 256k).

-ac - число каналов звуковой дорожки. Дефолтное значение для входящих потоков равно 1, для исходящих равно числу каналов входного файла.

Например, при захвате звука, по умолчанию, число каналов выставится 1, если берете звук из видео, то ac будет равно количеству каналов входного файла.

-an - кодирование видео без звука.

-acodec - установка аудиокодека, с помощью которого будет кодироваться аудиофайл (-acodec flac).

-apre - предустановка для аудиокодека.

 

Как обрезать видео (Crop)

Общий формат:

-vf crop=width:height:x:y

Настройка включает много переменных, рассмотрим простую обрезку:

-vf crop=200:200 - обрезка изображения от центра до размера 200х200.

-vf crop=in_w-2*15:in_h-2*25 - обрезка слева и справа по 15 пикселей и по 25 пикселей сверху и снизу, исходя из размера входного изображения.

-vf crop=2/3*in_w:2/3*in_h - обрезка от центра до 2/3 от исходного изображения.

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

Выражение для y может зависеть от x и наоборот.

К примеру -vf crop=800:600:0:0 - вырежет окошко размером 800х600 не из центра, а точно от левого верхнего угла.

 

Общие информационные функции

Список доступных форматов: ffmpeg.exe -formats

Список доступных кодеков: ffmpeg.exe -codecs

Список доступных фильтров: ffmpeg.exe -filters

Подробная информация о мультимедийном файле: ffmpeg.exe -i input.flv

Конвертация между форматами: ffmpeg.exe -i input.avi output.mpeg

Сохранение звуковой дорожки: ffmpeg.exe -i input.mpeg -vn -ab 128k output.mp3

По умолчанию битрейт равен 64кб/с, так что лучше самостоятельно задавать этот параметр.

Вырезаем кусок видеофайла без перекодировки:

ffmpeg.exe -i input.mpeg -ss 00:10:00 -t 00:05:00 -vcodec copy -acodec copy output.mpeg

Здесь мы получили 5-ти минутный фрагмент, отступив от начала видео 10 минут.

Микширование видеодорожки со звуковой:

ffmpeg.exe -i video.mpeg -vcodec copy -i audio.mp3 -acodec copy output.mpeg

Склеить несколько видео в один с переключением между ними:

ffmpeg.exe -i test1.mpeg -i test2.mpeg -vcodec copy -acodec copy -vcodec copy -acodec copy output.mpeg -newvideo -newaudio

Получаем в одном видеофайле две видеодорожки и две аудиодорожки.

Настройки -newvideo, -newaudio, -newsubtitle следует указать непосредственно после имени файла, в котором произойдёт объединение.

Сделать скриншот с видео:

ffmpeg.exe -i input.avi -an -ss 00:02:00 -r 1 -vframes 1 -s 720x480 -f image2 screenshot.png

Получим скриншот с разрешением 720х480 2-й минуты видео.

 

Как реализовать взаимодействие FFMPeg с программой. C# пример

Для полноценного видео конвертера нужен соответветствующий графический интерфейс. Думаем, что у вас не возникнут проблемы с формированием командной строки для ffmpeg.exe, но как же получить прогресс при конвертировании аудио/видео файлов.

Добавляем объекты Process и StreamReader

private Process m_ffmpegProcess = null;

private StreamReader m_streamReader = null;

private CultureInfo m_culture = new CultureInfo(0x0409);

private int m_progress = 0; // здесь будем хранить значение для прогресс бара

Инициализируем объект m_ffmpegProcess:

m_ffmpegProcess = new Process();

m_ffmpegProcess.StartInfo.FileName = // путь до ffmpeg.exe
m_ffmpegProcess.StartInfo.Arguments = // параметры конвертации
m_ffmpegProcess.StartInfo.UseShellExecute = false;
m_ffmpegProcess.StartInfo.RedirectStandardError = true;
m_ffmpegProcess.StartInfo.RedirectStandardOutput = true;
m_ffmpegProcess.StartInfo.CreateNoWindow = true; // скрываем процесс в панели

Данная функция запускает процесс конвертирования и обрабатывает строки, которые ffmpeg.exe выводит в консоль. Там то мы и будем обновлять наш прогресс бар:

private void StartConvert()
{
    m_ffmpegProcess.Start();
    m_streamReader = m_ffmpegProcess.StandardError;

    double duration = 0;
    string outString = null;
    while (!m_streamReader.EndOfStream)
    {
        outString = m_streamReader.ReadLine();
        if ((duration == 0) && outString.Contains("Duration: "))
        {
            int index = outString.IndexOf(",");
            TimeSpan span = TimeSpan.Parse(outString.Remove(index).Remove(0, 10).Trim(new char[] { Convert.ToChar(":") }).Trim());
            duration = span.TotalSeconds;
        }

        // Progress
        if ((duration > 0) && outString.Contains("time="))
        {
            string startStr = " time=";
            string stopStr = " bitrate=";

            int startIndex = outString.IndexOf(startStr);
            if (startIndex > 0)
            {
                int stopIndex = outString.IndexOf(stopStr);
                string time = outString.Substring(startIndex + startStr.Length, stopIndex - startIndex - startStr.Length);
                double progress = 100.0 * double.Parse(time, m_culture.NumberFormat) / duration;

                m_progress = (int)progress;
            }
        }
    }
}

На этом всё, надеемся что эта статья поможет вам освоить FFMpeg и выполнить все поставленные задачи.

Author: www.FreeSmartSoft.com