LINUX.ORG.RU

FFmpeg 9.0

 , , , ,


1

2

После почти четырёх месяцев разработки состоялся выпуск 9.0 проекта FFmpeg, с кодовым именем «Lei».

Это набор свободных библиотек и утилит с открытым исходным кодом на языке Си, позволяющих записывать, конвертировать и передавать цифровые аудио- и видеозаписи в различных форматах. Название происходит от названия экспертной группы MPEG и FF, означающего «fast forward».

Изменения:

  • расширены возможности конвертера цветов HDR на основе технологии AMD AMF;
  • поддержка мультиплексирования дорожек LCEVC в мультиплексоре MP4;
  • кодировщик и мультиплексор формата Playdate;
  • декодирование HE-AAC 960 (DAB+);
  • добавлены фильтры:
    • v360_vulkan: фильтр v360 панорамного видео с использованием Vulkan;
    • transpose_cuda: обмен местами строк и столбцов входного видео с опциональным зеркальным отражением;
    • vf_frc_amf: конвертер частоты кадров на основе AMD AMF;
    • фильтр битового потока для разделения многослойного HEVC в формате Dolby Vision.
  • поддержка и пересылка метаданных по стандарту SMPTE 2094-50;
  • поддержка аппаратного ускорения формата ProRes RAW;
  • кодировщик APV на основе Vulkan;
  • декодирование и демультиплексирование анимированных WebP;
  • поддержка аппаратного отображения в память технологии AMD AMF;
  • поддержка ONNX Runtime с бэкендом DNN с поддержкой аппаратного ускорения на GPU;
  • удалена поддержка декодирования CELT (не влияет на Opus CELT);
  • удалён парсинг OGG/CELT;
  • удалены устаревшие опции NVENC и поддержка NVENC SDK до версии 11.1.

>>> Скачать

>>> Подробности на GitHub и в первой редакции новости

★★★★★

Проверено: CrX ()
Последнее исправление: CrX (всего исправлений: 2)

поддержка аппаратного ускорения формата ProRes RAW

нужно!

Dispetcher14 ★★★★★
()

Ничего такого, по списку всякая шляпа с кодеками. Вот чего там не хватает - так это отложенного режима для аудио или видео (ну например MP3-радио). Чтобы можно было инициализировать контекст FFmpeg-а вне зависимости подключился ли клиент к потоку или нет. Это очень нужная фича, потому что без этого нельзя нормально писать приложения. Без контекста у тебя нет данных, которые нужно передать дальше в программе (тут не важно даже многопоточное приложение или нет), а пока контекст не инициализируется - не пойдёт дальше инициализация программы. Я был удивлён, что FFmpeg настолько архитектурно убог, хотя вроде считается мейнстримной библиотекой с кучей кодеков, но, как оказалось, что это не показатель.

P.S. Пытался придумывать всякие костыли, но всё равно пришёл к выводу, что инициализация должна быть не синхронной, а подключение к клиенту должно быть в avcodec_receive_frame который уже работает в отдельном потоке, а не при инициализации.

P.P.S. Даже спрашивал разработчиков на IRC. Ответили «нуууу у FFmpeg такая блокирующая архитектура». :P

Skullnet ★★★★★
()
Последнее исправление: Skullnet (всего исправлений: 2)

заходила с утра на сайт ffmpeg, ничего нового не было,
но ffmpeg-compat:8 слот появился в портаже Gentoo явно не спроста...


Что-то вкусного в списке изменений не нашла для себя

Sylvia ★★★★★
()
5 сентября 2026 г.
> pkg info ffmpeg
ffmpeg-9.0.1,1
Name           : ffmpeg
Version        : 9.0.1,1
Installed on   : Sat Sep  5 20:51:54 2026 MSK
Origin         : multimedia/ffmpeg
Architecture   : FreeBSD:15:amd64
Prefix         : /usr/local
Categories     : audio multimedia net
Licenses       : GPLv3+, LGPL3+, NONFREE
Maintainer     : multimedia@FreeBSD.org
WWW            : https://ffmpeg.org/
Comment        : Realtime audio/video encoder/converter and streaming server
Options        :
	ALSA           : off
	AMR_NB         : off
	AMR_WB         : off
	AOM            : on
	ARIBB24        : off
	ASM            : on
	ASS            : on
	BS2B           : off
	CACA           : off
	CDIO           : on
	CODEC2         : on
	DAV1D          : on
	DC1394         : off
	DEBUG          : off
	DOCS           : off
	DRM            : on
	DVD            : off
	FDK_AAC        : off
	FLITE          : off
	FONTCONFIG     : on
	FREETYPE       : on
	FREI0R         : off
	FRIBIDI        : off
	GCRYPT         : off
	GME            : off
	GMP            : on
	GNUTLS         : on
	GPL3           : on
	GSM            : off
	HARFBUZZ       : on
	ICONV          : on
	ILBC           : off
	JACK           : off
	JXL            : on
	KVAZAAR        : off
	LADSPA         : off
	LAME           : on
	LCMS2          : on
	LIBBLURAY      : off
	LIBPLACEBO     : on
	LIBRSVG2       : off
	LIBXML2        : off
	LTO            : off
	LV2            : off
	MFX            : off
	MODPLUG        : off
	MYSOFA         : off
	NETWORK        : on
	NONFREE        : on
	NVENC          : off
	OPENAL         : off
	OPENCL         : off
	OPENGL         : on
	OPENH264       : off
	OPENJPEG       : on
	OPENMPT        : off
	OPENSSL        : off
	OPTIMIZED_CFLAGS: on
	OPUS           : on
	POCKETSPHINX   : off
	PULSEAUDIO     : on
	RABBITMQ       : off
	RAV1E          : off
	RIST           : off
	RTCPU          : on
	RUBBERBAND     : off
	SDL            : off
	SMB            : off
	SNAPPY         : off
	SNDIO          : off
	SOXR           : off
	SPEEX          : on
	SRT            : off
	SSH            : off
	SVTAV1         : off
	TENSORFLOW     : off
	TESSERACT      : off
	THEORA         : on
	TWOLAME        : on
	V4L            : off
	VAAPI          : on
	VAPOURSYNTH    : off
	VDPAU          : on
	VIDSTAB        : on
	VMAF           : off
	VORBIS         : on
	VO_AMRWBENC    : off
	VPL            : off
	VPX            : on
	VULKAN         : on
	VVENC          : off
	WEBP           : on
	X264           : on
	X265           : on
	XCB            : on
	XVID           : on
	XVIDEO         : on
	ZIMG           : on
	ZMQ            : off
	ZVBI           : off
Shared Libs required:
	libX11.so.6
	libXext.so.6
	libXv.so.1
	libaom.so.3
	libass.so.9
	libbz2.so.4
	libc.so.7
	libcdio_cdda.so.2
	libcdio_paranoia.so.2
	libcodec2.so.1.2
	libdav1d.so.7
	libdrm.so.2
	libfontconfig.so.1
	libfreetype.so.6
	libgmp.so.10
	libgnutls.so.30
	libharfbuzz.so.0
	libjxl.so.0.12
	libjxl_threads.so.0.12
	liblcms2.so.2
	liblzma.so.5
	libm.so.5
	libmp3lame.so.0
	libopenjp2.so.7
	libopus.so.0
	libplacebo.so.360
	libpulse.so.0
	libspeex.so.1
	libtheoraenc.so.2
	libthr.so.3
	libtwolame.so.0
	libva-drm.so.2
	libva-x11.so.2
	libva.so.2
	libvdpau.so.1
	libvidstab.so.1.2
	libvorbis.so.0
	libvorbisenc.so.2
	libvpx.so.12
	libwebp.so.7
	libwebpmux.so.3
	libx264.so.165
	libx265.so.215
	libxcb-shape.so.0
	libxcb-shm.so.0
	libxcb-xfixes.so.0
	libxcb.so.1
	libxvidcore.so.4
	libz.so.6
	libzimg.so.2
Shared Libs provided:
	libavcodec.so.63
	libavdevice.so.63
	libavfilter.so.12
	libavformat.so.63
	libavutil.so.61
	libswresample.so.7
	libswscale.so.10
Annotations    :
	FreeBSD_version: 1501502
	cpe            : cpe:2.3:a:ffmpeg:ffmpeg:9.0.1:::::freebsd15:x64
	flavor         : default
Flat size      : 31.5MiB
Description    :
FFmpeg is a complete, cross-platform solution to record, convert and stream
audio and video. It includes libavcodec - the leading audio/video codec
library.

Ура! Я в деле!

iZEN ★★★★★
()
Ответ на: комментарий от Skullnet

А кто тебе мешает инициализировать его при появлении подключения? Кажется это не ffmpeg-а проблема.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Какую-то ерунду написал. Пока avformat_open_input на адрес не подключится, дальше вызов кода не пойдёт. Делать самопал на avio_alloc_context не предлагать. Это нужно по сути переписывать клиент для всех протоколов и всех кодеков и возвращать фреймы в определённом формате в колбеках, а доступа к внутренним функциям ffmpeg-а нет (то есть тащи сторонние библиотеки для кодеков и условно для HTTP и других протоколов), они не паблик. Как ни посмотри всё равно нужно делать фичу в самом ffmpeg.

Skullnet ★★★★★
()
Последнее исправление: Skullnet (всего исправлений: 1)
Ответ на: комментарий от Skullnet

А, я не так прочитал, думал у тебя listen сокет куда ты хочешь стримить что-то, и приходится ждать пока к нему извне кто-то подключится.

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

Без контекста у тебя нет данных, которые нужно передать дальше в программе

Что это например? Эту передачу нельзя тоже на потом отложить?

firkax ★★★★★
()
Ответ на: комментарий от firkax

Где нужно совсем асинхронно, придётся мультитред делать, но в большинстве софта можно и подождать.

Мультитред не поможет если в самом ffmpeg-е всё синхронно.

Что это например? Эту передачу нельзя тоже на потом отложить?

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

Skullnet ★★★★★
()
Последнее исправление: Skullnet (всего исправлений: 1)
Ответ на: комментарий от Skullnet

Так нет подключения - нет информации, ничего и не надо отображать. Подключится - отобразишь.

И синхронность ffmpeg-а тут не мешает, пока ты не подключился всё равно делать нечего с ним.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Так нет подключения - нет информации, ничего и не надо отображать. Подключится - отобразишь.

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

Skullnet ★★★★★
()
Последнее исправление: Skullnet (всего исправлений: 1)
Ответ на: комментарий от Skullnet

Пока avformat_open_input на адрес не подключится, дальше вызов кода не пойдёт.

А что ему ещё делать если того самого input вообще нету? Как он тебе open того чего ещё нет сделает?

Если тебе надо в гуйне во время подключения куда-то какой-нибудь сраный спиннер крутить, то это вообще не проблема ffmpeg, а твоя задача. Никто не зарпещает запустить тред с этим самым avformat_open_input, и написать там что надо тебе просигналить когда avformat_open_input вернётся, или callback дёрнуть. а пока оно input ждёт ты будешь спокойно свой спиннер крутить в гуйне.

Делов-то. Ты дольше тут жалуешься, чем потратил бы на написания десятка строчек кода который сделал бы avformat_open_input для твоей приблуды «асинхронным».

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Никто не зарпещает запустить тред с этим самым avformat_open_input, и написать там что надо тебе просигналить когда avformat_open_input вернётся, или callback дёрнуть. а пока оно input ждёт ты будешь спокойно свой спиннер крутить в гуйне.

Уже устал объяснять упорным дебилам, что это так не сработает. Представь что у тебя есть класс и в его конструкторе есть блокирующий вызов при подключении, но конструктор инициализирует все переменные класса, которые нужны и до коннекта, и на самом деле коннект там ни к месту и должен быть отдельным методом .connect(...), который и нужно вызывать в треде/цикле событий, но в ffmpeg-е увы не так и сделано всё синхронно прямо в функции инициализации. Никакими тредами ты это не исправишь, это архитектурный косяк.

Skullnet ★★★★★
()
Последнее исправление: Skullnet (всего исправлений: 2)
Ответ на: комментарий от Skullnet

Не понял, какой сервер? Ты прогой куда-то подключаешься чтобы тебе там дали видеопоток, к серверу? И этот сервер перед этим ждёт пока запустится твоя прога? Зачем?

firkax ★★★★★
()
Ответ на: комментарий от Skullnet

Представь что у тебя есть класс и в его конструкторе

Т.е. это какие ЦПП-проблемы? Ну сделай поле класса опциональным, а вызов этой функции в отдельном методе класса.

shdown ★★
()
Ответ на: комментарий от Skullnet

Ты сам себе злобный буратин и упоротый дебил, раз не можешь с такой элементарщиной разобраться, но уже лезешь «делать КЛАССы111!!!»

Может начать с чего-то попроще? Цепепе никуда не убежит, пока ты будешь учиться программировать.

От того, что ты будешь тут ныть, что плохой негодный ffmpeg мешает тебе «заниматься ООП» ты ничему не научишься.

Решается твоя ничтожная проблема элементарно, на самом деле, а ffmpeg совершенно не обязан что-то там «инициализировать в конструкторе».

Вот нахрена тебе именно в конструкторе класса что-то там инициализировать в ffmpeg? Ты и правда думаешь что везде и всюду есть конструкторы и они устроены именно так, как ты себе придумал? Что мешает тебе в твоём «КлАСсе111!!!» завести приватные «оБъеКТЫ!!!1111» и сохранять в них твои дурацкие настройки которые потом скармливать ffmpeg’у когда они действительно понадобятся при реальной устанвоке соединения?

Никакими тредами ты это не исправишь, это архитектурный косяк.

А зачем это вообще исправлять? Может просто не надо дрочить на ООП там где это совершенно неуместно? Или думать что ООП это центр вселенной и единственно правильное учение?

Забудь про классы свои и конструкторы и если ты не способен или не хочешь делать свою ООП обёртку над кодеками и сокетами, применяй ffmpeg так, как задумано его авторами, да и всё. Архитектурный косяк в твоём поделии, подходе и дрочеве вприсядку на ООП, а вовсе не в ffmpeg.

Это элементарно делается и тредами, и ещё парой способов. И это не косяк, а так и задумано, причём очень грамотно. Нехер что-то там конструировать, если ещё неизвестно, состоится коннект или нет. Было бы «архитектурно неправильно» - ffmpeg сдох бы давно. Это же не венда, которая вообще вся целиком архитектурно неправильная и выживает только на миллиардном маркетинге.

Все кому надо уже десятилетиями ffmpeg используют и не жужжат.

Плохому танцору … :)

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

Ты сам себе злобный буратин и упоротый дебил, раз не можешь с такой элементарщиной разобраться, но уже лезешь «делать КЛАССы111!!!»

Это была аналогия, чтобы было понятно как устроены объекты в ffmpeg. Я вообще писал на си.

Решается твоя ничтожная проблема элементарно, на самом деле, а ffmpeg совершенно не обязан что-то там «инициализировать в конструкторе».

Не решается. avformat_open_input - это как раз helper, который инициализирует кучу вещей внутри (исходники я конечно же читал, обойти пытался). Я ещё тогда ходил на IRC, где мне просто сказали, что решения просто нет, но «deferred connection» может быть добавят позже конкретно под use-case вроде моего. Я слишком многого хотел от библиотеки, которую проектировали в 2000 году для плееров/перекодирования видосиков. Предложили юзать какую-то другую сложную не-ffmpeg библиотеку с real-time композитингом аудио вроде как в OBS, но нафиг оно такое громоздкое надо ради тривиальщины.

Остальной поток сознания комментировать я не буду.

P.S. Кстати, фича то на половину реализована, в HTTP(S) если отключается - то пишет тишину как и положено, то же самое нужно делать при avformat_open_input пока не подключится.

Skullnet ★★★★★
()
Последнее исправление: Skullnet (всего исправлений: 3)
Ответ на: комментарий от Skullnet

Это была аналогия, чтобы было понятно как устроены объекты в ffmpeg. Я вообще писал на си.

И не мог написать код, который делал бы то, что ты хочешь? На сишке можно написать абсолютно всё, что угодно. И что же тебе на самом деле помешало это сделать? :) Какие-нибудь всратые «good programming practices» в основном пропагандируемые теми, кто нихера полезного не написал?

Ещё раз. Это ты неосилятор, а не ffmpeg неправильный. Нет никакой нужды что-то там заранее инициализировать, если совершенно неизвестно что приедет для декодирования.

Если тебе заранее известно, что именно приедет с удалённой машины - то нахрена тебе вообще ffmpeg? Есть намного более простые и лёгкие библиотеки заточенные на декодирование конкретного формата.

пишет тишину как и положено, то же самое нужно делать при avformat_open_input пока не подключится.

И что же мешает сделать это самостоятельно? Идут фреймы с ffmpeg - пишешь куда там тебе надо фреймы от ffmpeg. Нет фрейма от ffmpeg - пишешь фреймы с «тишиной», blue screen каким или, там, картинку с надписью «нет сигнала». В чём проблема-то?

И потом, с какого перепугу до вызова avformat_open_input тебе почему-то не надо «писать тишину», а после вызова - прям вынь да положь фреймы с тишиной получать? А если сервак на коннект ответит, но на запрос ACK не пришлёт - что, будешь писать тишину пока таймаут (который для TCP может быть немаленьким) не кончится?

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

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 2)
Ответ на: комментарий от Stanson

Ещё раз. Это ты неосилятор, а не ffmpeg неправильный. Нет никакой нужды что-то там заранее инициализировать, если совершенно неизвестно что приедет для декодирования.

Вообще плевать на формат буфера входных данных. Их всё равно ресемплировать, а реализовать ресемплер гораздо проще чем всё остальное.

И что же мешает сделать это самостоятельно?

То что все фичи обработчиков протоколов и кодеков приватные и скомпилированные в библиотеке, а писать самому по объему работы - теряется вообще всякий смысл в ffmpeg.

Уже который раз повторяю, а дебилу всё хочется спорить со взрослыми.

А если сервак на коннект ответит, но на запрос ACK не пришлёт - что, будешь писать тишину пока таймаут (который для TCP может быть немаленьким) не кончится?

Та же логика что и для обычного реконнекта.

Это у тебя архитектура всратая, как и выбранный способ решения некоей весьма странной задачи, которую ты, почему-то, так и не огласил

Огласил и даже разжевал для слабоумных. Архитектура ffmpeg-а больше расчитана на локальные штуки, когда данные уже есть, а не потоковые из Инета

Skullnet ★★★★★
()
Последнее исправление: Skullnet (всего исправлений: 4)
Ответ на: комментарий от Skullnet

То что все фичи обработчиков протоколов и кодеков приватные и скомпилированные в библиотеке, а писать самому по объему работы - теряется вообще всякий смысл в ffmpeg.

Зачем тебе вообще нужно лезть в фичи обработчиков протоколов? Какая конкретно задача должна быть решена какой-то там инициализацией чего-то там перед вызовом ffmpeg?

Огласил и даже разжевал для слабоумных

Я ещё тупее, значит. Огласи мне ещё разок, для какого конкретно рожна тебе нужно чтобы avformat_open_input тебе начала что-то там выдавать сразу после вызова и нахера тебе какие-то там параметры в ffmpeg настраивать если неизвестно что там приедет после коннекта. Конечная задача-то какая? Что твоя софтина вообще должна делать? Для чего конкретно вся эта всратость тебе вообще понадоблиась, и с какого перепуну ffmpeg должен предоставлять тебе возможности реализации этой невнятной упоротости прямо искаропки.

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

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Зачем тебе вообще нужно лезть в фичи обработчиков протоколов? Какая конкретно задача должна быть решена какой-то там инициализацией чего-то там перед вызовом ffmpeg?

У тебя галлюцинации? Давай ты уже признаешься, что нихрена не понимаешь, так как ffmpeg не юзал для написания прог, а просто тут ради срача. Мою проблему на IRC с полуслова поняли. Даже поговорили про реализацию fallback-колбеков пока не подключится.

Что твоя софтина вообще должна делать?

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

Skullnet ★★★★★
()
Последнее исправление: Skullnet (всего исправлений: 1)
Ответ на: комментарий от Skullnet

Давай ты уже признаешься, что нихрена не понимаешь,

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

так как ffmpeg не юзал для написания прог,

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

а просто тут ради срача.

Так это ты тут срач разводишь и какую-то секретность сраную развёл.

Мою проблему на IRC с полуслова поняли. Даже поговорили про реализацию fallback-колбеков пока не подключится.

Это только твои слова. Судя по результату тебя просто вежливо послали.

Так всё-таки, что же за софт-то такой сложный и секретный-то? :) Как очередной «знающий как надо», так никогда не рассказывает чем же он на самом деле занимается и для чего.

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

Ресурсов у него нет. :) Между ушами, что-ли? :)

Stanson ★★★★★
()
Ответ на: комментарий от firkax

Skullnet, ау. Я в самом деле не понял порядок выполнения, расскажи.

firkax ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.