Обновить

Комментарии 20

Недавно пришлось собирать ffmpeg под Windows компилятором MSVC. И знаете — я чуть не помер.

FFMpeg – большой, в его состав входит и FFPlay – консольный видео проигрыватель. А эта штука уже поинтересней будет для компиляции под «Форточки». Можно внедрить его в свое оконное приложение, как это, скажем, сделал я. Например, у меня есть неопубликованная программа «МедиаТекст».

http://scholium.webservis.ru/Pics/MediaText.png

Вот, с компиляцией «FFPlay.c» пришлось повозиться, поэтому, я вполне понимаю ваши трудности, тем более, что на Гитхабе я так ничего путного и не нашел.

В итоге, я преобразовал Си-код в классы С++, что и позволило мне скомпилировать проект. Неплохо получилось, в итоге.

Очень интересное решение! Я правильно понял, что вы просто забрали исходный код и попытались скомпилировать его с нуля в обход их системы сборки?

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

Очень интересное решение!

Да, мне самому нравится! :)

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

Правильно!

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

Да, это модификация файла «FFPlay.c», который был преобразован в классы «FFPlay.cpp».

http://scholium.webservis.ru/Pics/FFPlay.png

Каталоги включения:

./Main;./FFPlay;
../../Include;../../Include/FFmpeg;
../../Include/SDL2;
$(VC_IncludePath);
$(WindowsSdk_71A_IncludePath);
$(VCInstallDir)include;
$(VCInstallDir)atlmfc\include;
$(WindowsSdkDir)include;
$(FrameworkSDKDir)\include;

Используемые библиотеки:

avcodec.lib
avdevice.lib
avfilter.lib
avformat.lib
avutil.lib
postproc.lib
SDL2.lib
swresample.lib
swscale.lib

Соответственно, для работы приложения нужны аналогичные dll.

Код, за пределами модуля «FFPlay», я не модифицировал.

В принципе, собираюсь делать вторую версию этой программы, тогда и опубликую ее код.

P.S. Чем мне еще нравиться используемый медиа-проигрыватель, так это возможностью работы с mp3-файлами и файлами изображений (когда хочется, допустим, нецифровой pdf, т.е., просто набор сканов преобразовать, вручную, в текст. Для иностранных текстов это не слишком напрягает, так как, метод «запоминание руками» это базовый метод моей обучающей программы «L'école» (см. мои статьи здесь).

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

Я смотрел на реализацию плеера ffplay.c за вдохновением, но вдохновения не случилось, потому что там все очень заковыристо :) Но если пойти вашим путем и замести все эти заковырки за красивый фасад, то кому какое дело. Я попробую посмотреть в эту сторону, спасибо за идею

если пойти вашим путем и замести все эти заковырки за красивый фасад, то кому какое дело

Да, этот путь вполне рабочий. Все сопутствующие dll:

avcodec-58.dll
avdevice-58.dll
avfilter-7.dll
avformat-58.dll
avutil-56.dll
libfreetype-6.dll
postproc-55.dll
SDL2.dll
swresample-3.dll
swscale-5.dll

занимают более 72 мегабайт, а моя программа Main64r.exe – менее 530 килобайт. Все вместе это немного громоздко, зато полностью собственное решение.

Файлы «FFPlay.cpp» и «FFPlay.h» вместе дают чуть более 200 килобайт. Файл «Defs.h» почти 100%-но родной, я там поправил какую-то мелочь. Именно там идет ссылка на все библиотеки поддержки.

Так, что переработать вручную 200 килобайт опенсорсного кода, не должно быть слишком трудной задачей.

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

Что-то мне даже в голову не приходят причины почему можно захотеть собирать ffmpeg руками. На официальном сайте есть ссылки на аж два разных места где есть актуальные сборки из мастер ветки в разных вариантах.

https://www.ffmpeg.org/download.html#build-windows

Одно из мест собирает их на гитхабе поэтому если надо собрать какую-то особенную сборку можно просто форкнуть репозиторий и подкрутить CI/CD:

https://github.com/BtbN/FFmpeg-Builds/blob/master/.github/workflows/build.yml

да, мне нужна была кастомная сборка

мне если честно ваш вариант с форком не пришел в голову, так же как вам мой :) а что, таким образом можно будет получить сборку msvc-тулчейном?

В репозитории оно кросс-компилит через mingw32-gcc на линуксе насколько я вижу. Если нужен конкретно msvc, то тут, конечно не подойдет.

Есть вот такой репо, но насколько там актуальный CI/CD для сборки последних версий - сложно сказать:

https://github.com/System233/ffmpeg-msvc-prebuilt

Что-то мне даже в голову не приходят причины почему можно захотеть собирать ХХ руками.

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

Так что это всего лишь желание познать путь

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

`configure --prefix=...` и потом `make install` вам чем не нравится?

очень даже нравится

А можно ли как-то собрать минимальную сборку? Допустим мне нужно работать только с аудио и только с ogg и mp3.

Есть ли возможность скомпилировать крохотный ffmpeg?

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

Так а в чём сложность то? Насколько вижу - просто получили шелл msys с настроенным окружением VC и дальше ./configure;make , из нетривиального разве что спрятать link от msys и "удаляем rem из строки rem set MSYS2_PATH_TYPE=inherit".

Лет пятнадцать назад надо было по работе собрать Chromium на Windows XP с немного пропатченным V8 - там танцы с бубном начинались уже с протаскиванием репозиторев через корпоративный прокси.

Ну, если следовать по проторенной инструкции, сложности нет :)
А так вы правы - самое попившее кровь - это то, что вы перечислили. Просто мне не сразу довелось прийти к этим хакам - подсказки лежали то тут, то там в разных мануалах от разных людей

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

В vcpkg давно есть рецепт под сборку этой хрени.

Супер! Можно какую-то ссылку? Боюсь найти не то

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации