Пишемо свій 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кб/c, так що краще самостійно задавати цей параметр.

Вирізуємо шматок відеофайлу без тієї, що перекодувала:

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 i 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