Использование ffMPEG в Windows только с DLL?

Что я на самом деле хочу, так этохранить кадры видео в массиве символов, используя ffMPEG.

Ограничением является использование только MSVC. Не разрешается использоватьНастройка Windows из-за проблем с ремонтопригодностью.

Так рассмотрено использованиеобщая сборка выполнить задачу. Он состоит только из DLLs. нетlib файлы, поэтому я попытался загрузить одну из DLLс помощьюHINSTANCE hInstLibrary = LoadLibrary("avcodec-54.dll"); и это работает. Но я не могнайти интерфейсы этой DLL, опубликованные где угодно. Может ли кто-нибудь помочь с этим? Как узнать, какие функции библиотеки DLL я могу вызвать и какие параметры я могу передать, чтобы получить кадры видео?

 Nav09 нояб. 2012 г., 07:17
Связанная страница для использования сборки dev:stackoverflow.com/questions/11701635/..., Поверь мне, этоНамного проще написать программу с ответом в этой ссылке, чем в ответе ниже, потому что ответ ниже требует загрузки функции DLL и использования ее в качестве functionname_proc

Ответы на вопрос(1)

Решение Вопроса

Используйте публичный интерфейс ffmpeg из

ffmpegdir/include/libavcodec/
ffmpegdir/include/libavformat/
etc.

например, чтобы открыть файл для чтения, используйте avformat_open_input из ffmpegdir / include / libavformat / avformat.h

AVFormatContext * ctx= NULL;
int err = avformat_open_input(&ctx, file_name, NULL, NULL);

Вы можете получить последние сборки ffmpeg отhttp://ffmpeg.zeranoe.com/builds/

Открытые заголовочные файлы можно найти в сборках dev (http://ffmpeg.zeranoe.com/builds/win32/dev/).

UPD: Вот рабочий пример (без дополнительных статических ссылок)

#include "stdafx.h"
#include <windows.h>
#include <libavformat avformat.h="">

typedef int (__cdecl *__avformat_open_input)(AVFormatContext **, const char *, AVInputFormat *, AVDictionary **);
typedef void (__cdecl *__av_register_all)(void);

int _tmain(int argc, _TCHAR* argv[])
{
    const char * ffp = "f:\\Projects\\Temp\\testFFMPEG\\Debug\\avformat-54.dll";
    HINSTANCE hinstLib = LoadLibraryA(ffp);
    __avformat_open_input __avformat_open_input_proc  = (__avformat_open_input)GetProcAddress(hinstLib, "avformat_open_input");

    __av_register_all __av_register_all_proc = (__av_register_all)GetProcAddress(hinstLib, "av_register_all");
    __av_register_all_proc();

    ::AVFormatContext * ctx = NULL;
    int err = __avformat_open_input_proc(&ctx, "g:\\Media\\The Sneezing Baby Panda.flv", NULL, NULL);
    return 0;
  }
</libavformat></windows.h>
 pogorskiy07 нояб. 2012 г., 10:06
@ Нав см. Обновление к моему ответу
 Nav07 нояб. 2012 г., 09:34
Благодарю. На данный момент яя получаюunresolved external symbol ошибка дляavformat_open_input, Ваш код должен включатьlib файлы тоже? Потому что я пытался выполнить задачу исключительно с помощью библиотеки ffmpeg.с общей сборки (неНе забывайте знать, как это сделать с помощью сборок разработчика. Я столкнулся с некоторыми ошибками, когда я пытался с сборками Dev)
 Nav07 нояб. 2012 г., 10:03
Неразрешенная внешняя ошибка символа, которую я получал, была в строке, которую я использовал GetProcAddress. Я'используя файл inttypes.h, загруженный сcode.google.com/p/msinttypes/downloads/list потому что common.h это нужно. Даже когда я включаю libs, я получаю этоError 1 error LNK2019: unresolved external symbol "void __cdecl av_register_all(void)" ([email protected]@YAXXZ) referenced in function _main F:\Projects\VisualStudio\ffmpegTestProgram\ffmpegTestProgram\main.obj
 pogorskiy07 нояб. 2012 г., 09:45
Обычно используют статическую библиотеку (ffmpeg \ lib \ libavformat.dll.a) для доступа к динамическим библиотекам времени выполнения. Если по какой-то причиненевозможно, попробуйте использоватьGetProcAddress (hInstLibrary, "avformat_open_input ")» функция, как показано здесьmsdn.microsoft.com/en-us/library/windows/desktop/...
 Nav07 нояб. 2012 г., 10:21
Пробовал вашу программу (после удаленияstdafx, конвертируя_TCHAR вchar а также_tmain вmain). Он успешно построен. Огромное спасибо! :) Я просто надеюсь, что я 'был бы в состоянии использовать APIs, чтобы получить значения rgb в массив char, как я изначально хотел.

Ваш ответ на вопрос