Полезные команды ffmpeg | Losst

The first problem is that you are letting your YUV values go beyond allowed range (which is even stricter than 0x00..0xFF. but you don’t do any capping anyway). See:

Y’ values are conventionally shifted and scaled to the range [16, 235] (referred to as studio swing or «TV levels») rather than using the full range of [0, 255] (referred to as full swing or «PC levels»). This confusing practice derives from the MPEG standards and explains why 16 is added to Y’ and why the Y’ coefficients in the basic transform sum to 220 instead of 255.[8] U and V values, which may be positive or negative, are summed with 128 to make them always positive, giving a studio range of 16–240 for U and V. (These ranges are important in video editing and production, since using the wrong range will result either in an image with «clipped» blacks and whites, or a low-contrast image.)

Second problem is that 4:2:0 means that you end up with one Y value for every pixel, and one U and one V value for every four pixels. That is, U and V should be averages of corresponding pixels, and your loop simply overwrites the values with U and V of the fourth input pixel, ignoring the previous three.

You tagged the question with ffmpeg and your previous question is FFmpeg related too. Note that FFmpeg offers swscale library, which does the conversion way more efficiently compared to your loop and optimizations you could add to it. See related questions on SO:

By : Roman R.

Содержание

20 команд FFmpeg для начинающих

Оригинал: 20 FFmpeg Commands For Beginners
Автор: SK
Дата публикации: 10 мая 2017 года
Перевод: А. Кривошей
Дата перевода: октябрь 2017 г.

В этом руководстве мы объясним, как использовать мультимедийный фреймвок FFmpeg для преобразования различных аудио и видео файлов.

Стандартный синтаксис команды FFmpeg:

ffmpeg [global_options] {[input_file_options] -i input_url} … {[output_file_options] output_url} …

Далее мы рассмотрим некоторые важные и полезные команды FFmpeg.

1. Получение информации об аудио/видео файле

Для этого используется следующая команда:

Как можно видеть из этого примера, FFmpeg отображает информацию о мультимедийном файле вместе с данными FFmpeg, такими как версия, сведения о конфигурации, уведомления об авторских правах, варианты сборки, библиотеки и т. д.
Если вы не хотите видеть баннер FFmpeg и другие данные, а только информацию о файлах мультимедиа, используйте флаг -hide_banner, как показано ниже.

$ ffmpeg -i video.mp4 -hide_banner

2. Конвертирование видеофайлов в различные форматы

FFmpeg — это мощный аудио и видео конвертер, позволяющий преобразовывать медиафайлы в различные форматы. Например, чтобы преобразовать файл mp4 в avi, выполните команду:

$ ffmpeg -i video.mp4 video.avi

Точно так же вы можете конвертировать медиафайлы в любой формат по вашему выбору.
Например, чтобы преобразовать видео в формате FLV из YouTube в формат mpeg, выполните:

$ ffmpeg -i video.flv video.mpeg

Проверить список поддерживаемых FFmpeg форматов можно с помощью следующей команды:

$ ffmpeg -formats

3. Конвертирование видео файлов в аудио

Чтобы преобразовать видео файл в аудио, просто укажите формат вывода, например .mp3 или .ogg, либо любой другой аудиоформат.
Приведенная ниже команда преобразует видео файл file.mp4 в file.mp3.

$ ffmpeg -i input.mp4 -vn -ab 320 output.mp3

Также вы можете использовать различные опции конвертирования, как показано ниже:

$ ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3

Здесь:

-vn – говорит о том, что мы отключили запись видео в конечный файл.
-ar – задает частоту дискретизации звука конечного файла. Наиболее широко используются значения 22050, 44100, 48000 Гц.
-ac – задает количество аудиоканалов.
-ab – задает битрейт.
-f – формат конечного файла. В нашем случае это mp3.

4. Изменение разрешения видео

Предположим, вы хотите задать для видео файла определенное разрешение, это делается с помощью следующей команды:

$ ffmpeg -i input.mp4 -filter:v scale=1280:720 -c:a copy output.mp4

или

$ ffmpeg -i input.mp4 -s 1280×720 -c:a copy output.mp4

Приведенная выше команда задает разрешение видео 1280×720.

Аналогично, чтобы преобразовать этот файл к разрешению 640×480, выполните:

$ ffmpeg -i input.mp4 -filter:v scale=640:480 -c:a copy output.mp4

или

$ ffmpeg -i input.mp4 -s 640×480 -c:a copy output.mp4

5. Сжатие видео

Всегда хочется уменьшить размер медиафайлов, чтобы освободить место на жестком диске.
Следующая команда сжимает видео и уменьшает размер файла.

$ ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4

Помните, что при сжатии ухудшается качество. Для его сохранения можно снизить значение crf до 23 или еще ниже.

6. Сжатие аудио.

Вы также можете сжимать аудио файлы с помощью флага -ab, чтобы освободить место на диске.
Предположим, что ваш файл имеет битрейт 320 кб/с. Вы можете сжать его, уменьшив битрейт.

$ ffmpeg -i input.mp3 -ab 128 output.mp3

Ниже список доступных битрейтов:

96kbps
112kbps
128kbps
160kbps
192kbps
256kbps
320kbps

7. Удаление из медиафайла аудиопотока.

Если вам не нужен звук в видео файле, вы можете удалить аудиопоток с помощью флага -an.

$ ffmpeg -i input.mp4 -an output.mp4

Приведенная выше команда отменяет все связанные с аудио флаги, потому что мы удаляем звук из input.mp4.

8. Удаление видеопотока из медиафайла.

Аналогично, если вам не нужен видеопоток, вы можете легко удалить его из медиафайла с помощью флага «vn». Другими словами, эта команда преобразует заданный медиафайл в звуковой файл.

Следующая команда удалит видео из медиафайла.

$ ffmpeg -i input.mp4 -vn output.mp3

Вы также можете задать битрейт конечного файла с помощью флага «ab», как показано ниже.

$ ffmpeg -i input.mp4 -vn -ab 320 output.mp3

9. Извлечение изображений из видео

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

$ ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png

здесь:

-r – задает фреймрейт, то есть количество извлекаемых фреймов в 1 секунде видео. Значение по умолчанию — 25.
-f – формат извлекаемого изображения.
image-%2d.png – задает названия для наших файлов изображений. В этом примере это имена image-01.png, image-02.png, image-03.png и так далее. Если вы зададите %3d, то получите имена image-001.png, image-002.png и так далее.

10.

PIX FMT YUV420P

Обрезка видео

В целом это похоже на изменение разрешения видео. Скажем, если вам нужно видео с разрешением 300×300, вы можете получить его с помощью следующей команды:

$ ffmpeg -i input.mp4 -croptop 100 -cropbottom 100 -cropleft 300 -cropright 300 output.mp4

Необходимо помнить, что обрезка видео отрицательно влияет на его качество.

11. Конвертирование части видео

Иногда нужно конвертировать в другой формат только часть видео файла. Например, приведенная ниже команда конвертирует первые 50 секунд файла video.mp4 в файл video.avi.

$ ffmpeg -i input.mp4 -t 50 output.avi

Здесь мы задаем время в секундах. Также можно задавать его в формате hh.mm.ss.

12. Установка соотношения сторон видео

Вы можете задать соотношение сторон видео файла с помощью флага -aspect, как показано ниже.

$ ffmpeg -i input.mp4 -aspect 16:9 output.mp4

Обычно используются следующие соотношения:

16:9
4:3
16:10
5:4
2:21:1
2:35:1
2:39:1

13. Добавление постера в аудио файлы

Вы можете добавлять изображения постеров в ваши файлы, чтобы они показывались во время воспроизведения файла. Это может быть полезно при размещении их на видеохостингах или веб-сайтах.

14. Вырезание части видео файла

Чтобы вырезать часть видео файла и сохранить ее в отдельный клип, используется команда вида:

$ ffmpeg -i input.mp4 -ss 00:00:50 -codec copy -t 50 output.mp4

здесь

–s – указывает время, с которого начинается вырезание видео, в нашем примере с 50-й секунды.
-t – указывает продолжительность нашего клипа.

15. Разрезание видео файла на несколько частей

Некоторые сайты позволяют загружать видео файлы не больше определенного размера. В таком случае вы можете разрезать большой файл на части меньшего размера.

$ ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4

Здесь -t 00:00:30 показывает, что первая часть берется от начала видео до 30-й секунды. -ss 00:00:30 задает начальную точку для второй части. То есть вторая часть берется с 30-й секунды до конца оригинального видео.

16. Объединение нескольких видео файлов

FFmpeg также позволяет объединять несколько видео файлов в один.

Создайте файл join.txt, в котором записаны пути ко всем видео файлам, которые вы хотите объединить. Все части должны иметь один формат (один кодек).

/home/sk/myvideos/part1.mp4
/home/sk/myvideos/part2.mp4
/home/sk/myvideos/part3.mp4
/home/sk/myvideos/part4.mp4

Теперь вы можете объединить их с помощью команды:

$ ffmpeg -f concat -i join.txt -c copy output.mp4

17. Добавление субтитров в видео файл

С помощью FFmpeg мы также можем добавлять субтитры в видео файл. Это делается с помощью следующей команды:

18. Тестирование видео и аудио файлов

Если вам хочется проверить, правильно ли было произведено конвертирование файла, вы можете воспроизвести его в терминале с помощью команды:

$ ffplay video.mp4

Аналогично вы можете протестировать аудио файл, как показано ниже.

$ ffplay audio.mp3

19. Ускорение/замедление воспроизведения видео

FFmpeg позволяет вам регулировать скорость воспроизведения.

Для увеличения скорости воспроизведения используется команда:

$ ffmpeg -i inputvideo.mp4 -vf «setpts=0.5*PTS» outputvideo.mp4

Для замедления скорости воспроизведения:

$ ffmpeg -i inputvideo.mp4 -vf «setpts=4.0*PTS» outputvideo.mp4

20. Получение помощи

В этом руководстве мы показали только самые основные и часто используемые команды FFmpeg. На самом деле он имеет огромное количество различных опций для реализации разных продвинутых возможностей. Найти их описание можно на man-странице:

$ man ffmpeg

Если вам понравилась статья, поделитесь ею с друзьями:


Статьи / Декодирование видео FFmpeg

Декодирование видео FFmpeg

Отправить ссылку: В Мой Мир

Декодирование видео с помощью FFmpeg
Если вы хотите узнать о том как записывать файл с помощью ffmpeg, то этому посвящена эта статья.

Введение

При написании мультимедийных программ часто возникает необходимость декодирования (чтения) видеофайлов. Предположим, вам необходимо написать мультимедиа плеер или проиграть видеоролик в игре. Решение задачи должно быть максимально кроссплатформенное. Для решения данной задачи идеально подходит FFmpeg.

О библиотеке FFmpeg

FFmpeg — кроссплатформенная библиотека, созданная для декодирования и кодирования мультимедийных файлов. Библиотека имеет открытый исходный код и распространяется под лицензией GPL и LGPL. Следовательно, библиотеку можно использовать в коммерческих проектах.

FFmpeg используется в таких проектах как: ffmpeg2theora, VLC, MPlayer, Handbrake, Blender, Google Chrome и многих других.

Подготовка FFmpeg

Для использования FFmpeg необходимо проделать подготовительные действия. Есть несколько путей подготовки FFmpeg:

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

Второй путь, который выбрал автор этой статьи, это скачивание сторонних билдов, их можно найти на сайте: http://ffmpeg.arrozcru.org/. FFmpeg включает в себя следующие библиотеки: avcodec, avdevice, avformat, avutil, swscale.

Для использования библиотек в Visual Studio возможно динамически загрузить функции или использовать lib файлы. Как по dll файлам получить lib файлы можно узнать, если прочитаете статью по использованию LibVLC. Также необходимо скачать исходный файл для получения h-файлов с прототипами функций.

Заголовочные файлы необходимо модифицировать, добавив в файлы код:

Чтобы мы смогли их использовать в проекте на C++.

Теперь для использования FFmpeg у нас есть все, перейдём к декодированию. Забегая вперёд скажу, что в конце статьи вы сможете найти пример, где все эти действия уже проделаны.

Кратко о видеофайлах

Видеофайлы могут иметь различные форматы, например avi, wmv, ogg. Формат — это контейнер, который определяет внутреннюю структуру файла. В общем виде видеофайл можно представить в следующем виде:

Заголовок видео файла Пакет Пакет Пакет Пакет Пакет Пакет Индексы

Заголовок файла содержит информацию о разрешении картинки, о кодеках, которые используются для сжатия, о количестве потоков и многое другое.

Пакеты — это закодированные данные. Пакеты могут содержать сжатое изображение или его часть (т.е.

Гайд для установки 4K разрешения на PS4 Pro

ту часть, которая отличается от предыдущего кадра), а могут сжатый звук. Пакеты не имеют определенного порядка и могут чередоваться.

Индексы содержат информацию о ключевых кадрах. Для улучшения сжатия в видеофайлах пакеты могут содержать не весь кадр, а только изменившуюся часть. Ключевыми же кадрами являются те кадры, которые полностью содержатся в пакете.

Стоит заметить, что видеофайл может содержать несколько аудиодорожек, например, для разных языков. Хотя видеодорожек тоже может быть несколько, но это редкий случай.

Декодирование видеофайлов с помощью FFmpeg

Декодирование видеофайла будет описано по шагам. В общем видео процесс можно описать так: инициализация FFmpeg, открытие файла, получение информации о файле, считывание и декодирование пакетов, закрытие файла. Рассмотрим каждый шаг более подробно:

Шаг 0: Инициализация FFmpeg

Шаг 1: Открытие файла

Открываем файл и получаем его контекст. По имени файла мы открываем его и проверяем, что файл открылся успешно:

Шаг 2: Поиск потоков и открытие декодеров

Поиск потоков видео и звука, а также поиск декодеров для них. Если файл закодирован неизвестным декодером, то произойдет ошибка открытия декодера.

Поиск видеопотока и открытие декодера:

Поиск аудиопотока и открытие декодера отличается от поиска потока видео только константой CODEC_TYPE_AUDIO.

Шаг 3: Получение информации о потоках

Мы получаем информацию о потоках, такую как разрешение, длина, количество кадров в секунду.

Получение информации о видеопотоке:

Получение информации о аудиопотоке очень похоже. Только высоты и ширины у него нет.

При полном или частичном копировании необходимо указывать ссылку на данную статью.

Олег (Дата )

Все вопросы и предложения высылайте на адрес soft_support@list.ru. Необходимо в заголовке указать название статьи.

Оставь свой отзыв



Понимаем FFmpeg

Арсений Васильев, 20 Марта 2016

FFmpeg — это набор библиотек для обработки видео и аудио файлов. FFmpeg сконвертирует mov в mp4, наложит водяной знак, склеит несколько видео файлов в один, поменяет разрешение, перекодирует потоковое видео, создаст поток сам. FFmpeg полезен для тех, кто профессионально работает с видео, разрабатывает медиа приложения или просто обрабатывает домашние записи.

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

Сегодня мы пройдем путь от получения информации о файле до применения нескольких фильтров одновременно, решая задачи, с которыми часто сталкиваешься при работе с видео.

Установим ffmpeg и вперед!

Получаем информацию о файле

Тут все просто, вводим путь к файлу, получаем информацию о нем: кодеки, количество дорожек, разрешение, битрейт и фреймрейт. Мы указываем пути к файлам флагом (input):

.

Конвертируем в mp4

Допустим у нас есть сайт, на котором видео проигрывалось через Flash плеер. Мы хотим поменять его на HTML5 Video. Для этого конвертируем видео файлы на сервере из flv формата в mp4.

По сравнению с предыдущей командой добавилось три поля.

  • — путь к сконвертированному файлу.
  • — указываем какой видео кодек хотим получить. В нашем случае это H264, который поддерживается большинством браузеров.
  • — аудио кодек AAC.

Список поддерживаемых вашим ffmpeg кодеков можно получить через .

Вместо встречается запись и . Если не указать кодеки для конвертации , то ffmpeg установит дефолтные кодеки для формата файла на выходе.

При конвертации задают не только кодеки. Увеличим число настроек:

Мы установили битрейт для видео и аудио в 700 и 128 кб/c. Битрейт можно обозначить другими флагами: и для видео или для аудио.

Оставшиеся три параметра — это фреймрейт в кадрах в секунду, цветовая модель YUV равная обычному значению yuv420p и частота дискретизации звука 44100 Гц. Флаг нужен для перезаписи файла, если он уже существует.

Вырезаем фрагмент видео

Флагом указываем с какого момента исходного видео обрезаем, — продолжительность. На выходе мы получим двадцати секундное видео, которое начнется с десятой секунды исходного. Запись пригодится для указания более точного промежутка времени. До версии 2.1 FFmpeg в обоих случаях обрезал видео по ближайшему ключевому кадру. В новых версиях итоговое видео максимально близко к указанному интервалу.

Мы добавили , чтобы сохранить кодеки исходного видео. Иначе ffmpeg перекодировал бы их в кодеки по умолчанию. Сейчас видео не перекодируется и команда выполнится быстро. Дальше упростим эту запись флагом .

Если расположить флаги и после входящего видео, то итоговое видео будет таким же, но команда будет выполняться дольше. Флаги будут относиться к итоговому видео и FFmpeg будет декодировать фрагмент видео до . В первом случае эта часть будет проигнорирована.

Флаг можно заменить на , указав вместо продолжительности конечную точку. Этот флаг нельзя применить к входящему видео:

Команда дала нам другой результат: тридцати секундное видео с десятой секунды исходного. Это произошло, потому что использовал временную шкалу , тридцатая секунда на котором равна сороковой секунде . Чтобы использовать исходную шкалу добавим флаг . Так мы получим такое же видео, как от первой команды:

Фильтры. Меняем разрешение

Один из самых мощных инструментов ffmpeg — фильтры.

2160p YUV420 или 2160p RGB?

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

Мы использовали флаг , указав фильтр и разрешение . Этот фильтр может сохранять пропорции и вычислять разрешение динамически.

Объединение фильтров. Ускоряем воспроизведение

Мы объединили несколько фильтров в один флагом и получили ускоренный в два раза файл. Чтобы разобраться применим фильтры по одиночке.

Мы ускорили воспроизведение видео дорожки фильтром . Однако аудиодорожка не изменилась, и файл получится той же продолжительности что и был: видео проиграется в 2 раза быстрее, а последний кадр будет висеть всю вторую половину файла. Если убрать аудио дорожку флагом , то длительность итогового файла будет определяться по видео дорожке и будет в два раза меньше исходной.

Наоборот, если нужна только ускоренное аудио без видео, воспользуемся фильтром , а флагом уберем видео дорожку.

Добавив и применив оба фильтра, мы ускорили файл целиком.

Граф фильтров применяет последовательность из нескольких фильтров к исходному файлу. Мы указали ускорение для видео дорожки и для аудио . С помощью комбинаций фильтров мы можем решить большинство задач по редактированию видео.

Склеиваем файлы в один

Мы видим новый флаг . Он указывает ffmpeg какие дорожки хотим получить в итоговом файле. Если в наших исходных видео файлах гарантировано одна видео и аудио дорожка, и столько же мы хотим получить на выходе, то флаг map не нужен. Другие примеры использования Map можно посмотреть на сайте ffmpeg.

Выполним ту же операцию другим методом:

В FFmpeg есть элементы, которые читают или записывают медиа в определенных форматах. Они называются демультиплексор и мультиплексор. — это демультиплексор, который принимает текстовый файл, со списком медиа файлов и склеивает их в один. Посмотреть другие элементы можно командой .

Содержимое list.txt:

Такой метод удобен, если у нас много файлов и надо склеить их друг за другом. Он не перекодирует видео и работает быстрее первого метода.

Но первый метод применяется чаще. Во-первых, он может принять на вход видео с разными кодеками. Во-вторых, дает большую гибкость. Например, если нужна только часть первого видео, мы можем воспользоваться флагами и . Обратите внимание, эти флаги действуют только на первый файл .

Водяной знак

Последний пример, который мы рассмотрим — это наложение водяного знака. Фильтр принимает на вход координаты расположения водяного знака на итоговом видео.

Расположим водяной знак по центру. Зная размер исходного видео и png картинки, можно вычислить координаты самим. Например при видео 1280×720 и водяном знаке 200×200, положение по горизонтали и по вертикали .

Соответственно значение фильтра . Однако удобнее написать универсальную команду, чтобы ffmpeg посчитал все за нас. Размер видео получим из параметров и , а водяного знака из  и . Далее ту формулу, по которой мы вычисляли координаты запишем в значение фильтра . Готово, мы получили команду для наложения водяного знака по центру:

FFmpeg — мощный инструмент для работы с видео. Решение других задач с его помощью можно посмотреть в статье 19 команд ffmpeg для всех нужд.

Поделиться

Плюсануть

Отправить

Поделиться

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *