Используйте FFmpeg в Visual Studio

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

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

1 ответ

Решение

С FFmpeg вы можете:

  1. используйте предварительно созданные файлы.lib/.dll, и ваш двоичный файл, созданный с помощью Visual Studio, будет зависеть от файлов av*.dll
  2. скомпилируйте 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 на дополнительный путь включения. Этого будет достаточно для создания двоичного файла, и это будет зависеть от av*.dll:

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

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

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

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

Другие вопросы по тегам