Использовать FFmpeg в Visual Studio

Я пытаюсь использовать FFmpeg в проекте С++ в Visual Studio 2010. Я хочу включить библиотеки в качестве статически связанных файлов. Простые программы, такие как libavcodec/api-example.c компилируются без ошибок, и при запуске их не появляется ошибка компоновщика. Однако после запуска приложения появляется окно с сообщением о том, что avutil-51.dll отсутствует. У вас есть какие-то намеки на то, как это исправить?

Я использовал последнюю версию dev из http://ffmpeg.zeranoe.com/builds/. Затем я указывал include как дополнительный каталог include, avcodec.lib; avfilter.lib; avformat.lib; avutil.lib в качестве дополнительных зависимостей и lib в качестве дополнительного каталога библиотеки.

Ответы

Ответ 1

С помощью FFmpeg вы можете:

  • используйте предварительно созданные файлы .lib/.dll и ваш двоичный файл, созданный с помощью Visual Studio, будут зависеть от файлов av *.dll.
  • скомпилировать FFmpeg из исходного кода в статические библиотеки с использованием компилятора, отличного от Microsoft, а затем связать его с проектом Visual Studio (в этом случае, если учесть лицензию LGPL/GPL)

Вы создали свой проект согласно пункту 1 выше. Вы должны использовать и перераспределять файлы, зависящие от av *.dll, с вашим двоичным файлом, чтобы он работал.

"Статический" на Zeranoe означает, что библиотеки статически связаны с двоичными файлами, такими как ffmpeg.exe. Не путайте это со статическими библиотеками .lib, которые ссылаются на ваш двоичный файл. Зерано не дает такого.

В Zeranoe вы найдете такие архивы:

  • "Общий" ffmpeg-20120726- git -236ecc3-win32-shared.7z:
    • bin/avcodec-54.dll
    • bin/avutil-51.dll
    • и т.д.
  • "Dev" ffmpeg-20120726- git -236ecc3-win32-dev.7z:
    • lib/avcodec.lib
    • lib/avutil.lib

"Общий" архив имеет FFmpeg, построенный с динамической ссылкой на библиотеки DLL. В архиве "Dev" есть файлы lib, которые вы можете использовать в своем проекте для ссылки на них так же, как ffmpeg.exe в общем архиве.

Итак, ваш проект Visual Studio может быть таким же простым, как это (просмотреть полный источник здесь):

extern "C" 
{
        // NOTE: Additional directory ..\zeranoe.com\dev\include gets to the files
        #include "libavcodec\avcodec.h"
}

// NOTE: Additional directory ..\zeranoe.com\dev\lib gets to the files
#pragma comment(lib, "avcodec.lib")

// NOTE: Be sure to copy DLL files from ..\zeranoe.com\shared\bin to the directory of 
//       the FFmpegApp.exe binary
int _tmain(int argc, _TCHAR* argv[])
{
        _tprintf(_T("Trying avcodec_register_all... "));
        avcodec_register_all();
        _tprintf(_T("Done.\n"));
        return 0;
}

Вы извлечете архив "Dev" в подкаталог dev проекта Visual Studio, и вы добавите dev\include в дополнительный путь include. Этого будет достаточно для создания двоичного файла, и он будет зависеть от av*.dll:

enter image description here

Это когда вы извлекаете "Общий" архив и копируете DLL из его bin в каталог вашего двоичного файла. И ваше приложение будет работать оттуда:

C:\FFmpegApp\Release>FFmpegApp.exe
Trying avcodec_register_all... Done.

20 января 2016 г. UPDATE. Проект в репозитории обновлен до Visual Studio 2013 (более старый код VS 2010) и проверен на текущие сборки Zeranoe. Образец и инструкции остаются в хорошем состоянии.

Обратите внимание, что Win32 в Visual Studio предполагает, что вы используете 32-битные файлы из Zeranoe. Чтобы построить 64-битную версию, загрузите соответствующие файлы и настройте проект Visual С++, соответственно, для сборки x64 (или, лучше всего, загрузите оба варианта, настройте обе конфигурации и настройте include/lib paths соответственно). Невыполнение битности приведет к ошибке, упомянутой в комментариях ниже.