0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13

[WPF] Подключение dll (ffmpeg)

30.06.2017, 16:38. Показов 4134. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вижуха 17. Проект WPF C#.
Столкнулся с проблемой подключения ffmpeg к проекту.
Либы не получается подключить т.к для #pragma разрешены только checksum и warning.
Подключаю using System.Runtime.InteropServices; для [DllImport("avcodec-57.dll")], а он выдает ошибку "не допускается для этого типа объявления. ..."
В ссылки не добавляются .dll, выдавая ошибку "Не удается добавить ссылку на ... . Убедитесь, что файл доступен, и является допустимой сборкой или компонентом СОМ.".
Потратил несколько часов на поиск в инете за зря.
Во вложении либы,хедеры,библиотеки, пикча с ошибкой.
dll.part1.rar
dll.part2.rar
include.rar
lib.rar
[WPF] Подключение dll (ffmpeg)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.06.2017, 16:38
Ответы с готовыми решениями:

Подключение dll в WPF
Всем здравствуйте, у меня такой вопрос, как подключить библиотеку dll в WPF, и как ее инициализировать в коде?

Упаковать dll внутрь WPF приложения
Приветствую товарищи! в wpf новичок, и уже два дня ломаю голову и гугл поиском решения. :cry: Как же можно запеч внешние...

Как зашить dll в exe? (wpf)
Всем привет! Собственно в чем проблема. Подключил к проекту свою библиотеку. Программа маленькая и надо что бы на выходе был один exe...

15
Эксперт С++
 Аватар для _lunar_
3701 / 2835 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
30.06.2017, 16:42
Вы что серьёзно собирались использовать в шарпе директивы плюсов?
Зачем тогда using, сразу бы иклудили сборки, что такого...
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
30.06.2017, 16:53  [ТС]
Заместо колких высказываний правильный ответ подошел бы лучше
0
Эксперт .NET
 Аватар для Wolfdp
2626 / 1578 / 352
Регистрация: 15.06.2012
Сообщений: 5,862
Записей в блоге: 3
30.06.2017, 17:04
если нужен просто конвертер, есть решение в виде NReco.VideoConverter, подключается через nuget
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
30.06.2017, 17:05
Цитата Сообщение от neokms Посмотреть сообщение
Потратил несколько часов на поиск в инете за зря.
Чё даже на официальный репозиторий не попал?
https://github.com/Microsoft/FFmpegInterop

там в samples всё есть. Тебе нужны примеры для cs.
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
30.06.2017, 18:31  [ТС]
Чё даже на официальный репозиторий не попал?
https://github.com/Microsoft/FFmpegInterop

там в samples всё есть. Тебе нужны примеры для cs.
Заглядывал, там, как я понял, библиотеки подключены ссылками, что у меня не получается сделать.
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
30.06.2017, 18:41  [ТС]
Такие дела
[WPF] Подключение dll (ffmpeg)
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
01.07.2017, 04:21  [ТС]
Вопрос все еще остается открытым.
0
Эксперт .NET
 Аватар для Usaga
12874 / 8913 / 1323
Регистрация: 21.01.2016
Сообщений: 33,478
01.07.2017, 04:32
neokms, библиотеки, что вы хотите подключить, видимо являются неуправляемыми (написаны на Си или С++), что делает невозможным их подключение к проекту. Для работы с кодом на Си из C# используйте p\invoke (гугл и учебник по C# в помощь).
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
01.07.2017, 12:14  [ТС]
neokms, библиотеки, что вы хотите подключить, видимо являются неуправляемыми (написаны на Си или С++), что делает невозможным их подключение к проекту. Для работы с кодом на Си из C# используйте p\invoke (гугл и учебник по C# в помощь).
Да яж говорил что не работает все это
Кто-нибудь может дать внятное решение данной проблемы?
Либо кто-нибудь обоснует, что не возможно подключить ffmpeg к c# (а это не так).
0
22 / 21 / 11
Регистрация: 13.11.2016
Сообщений: 75
01.07.2017, 14:58
Неуправляемую библиотеку я бы подключал примерно так:
Создал бы класс в проекте БлаблаблаWrapprer далее в нём сделал бы следующее:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        #region Импорт dll
        [DllImport("kernel32.dll")]
        private static extern IntPtr LoadLibrary(string path);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void Init();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void Close();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int IsAlive();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void RegisterEventHandler(OnKeyDownCallbackDelegate dk, OnDeviceStateChangedCallbackDelegate ds);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int SendCommand(byte c1, byte c2);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int SendCommandBlocking(byte c1, byte c2);
        #endregion
Далее в конструкторе или инициализаторе класса:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public БлфблаWrapper()
{
                #region Загрузка dll
                string path = string.Format("{0}\\{1}\\{2}",
                                                Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                                                Environment.Is64BitProcess ? "x64" : "x86", // Если две дллки под 32 и под 64 разряда
                                                IntPtr.Size == 8 ? "x64" : "x86", // Если две дллки под 32 и под 64 разряда
                                                "OptimusMini.dll");
 
                IntPtr ptr = LoadLibrary(path);
 
                if (ptr == IntPtr.Zero)
                {
                    throw new Win32Exception(string.Format("Не удалось загрузить библиотеку OptimusMini.dll"));  
                }
                #endregion
}
Если бы длл не загружалась бы - то попробовал бы поменять параметр CallingConvention.Cdecl при импорте методов.
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
01.07.2017, 15:11  [ТС]
Цитата Сообщение от Padmasambhava Посмотреть сообщение
Неуправляемую библиотеку я бы подключал примерно так:
Создал бы класс в проекте БлаблаблаWrapprer далее в нём сделал бы следующее:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        #region Импорт dll
        [DllImport("kernel32.dll")]
        private static extern IntPtr LoadLibrary(string path);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void Init();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void Close();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int IsAlive();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void RegisterEventHandler(OnKeyDownCallbackDelegate dk, OnDeviceStateChangedCallbackDelegate ds);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int SendCommand(byte c1, byte c2);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int SendCommandBlocking(byte c1, byte c2);
        #endregion
Далее в конструкторе или инициализаторе класса:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public БлфблаWrapper()
{
                #region Загрузка dll
                string path = string.Format("{0}\\{1}\\{2}",
                                                Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                                                Environment.Is64BitProcess ? "x64" : "x86", // Если две дллки под 32 и под 64 разряда
                                                IntPtr.Size == 8 ? "x64" : "x86", // Если две дллки под 32 и под 64 разряда
                                                "OptimusMini.dll");
 
                IntPtr ptr = LoadLibrary(path);
 
                if (ptr == IntPtr.Zero)
                {
                    throw new Win32Exception(string.Format("Не удалось загрузить библиотеку OptimusMini.dll"));  
                }
                #endregion
}
Если бы длл не загружалась бы - то попробовал бы поменять параметр CallingConvention.Cdecl при импорте методов.
Да, делал я так. Он ругается при объявлении методов на аргументы. Без ссылки на длл не хочет их принимать, а ссылки не добавляются т.к ошибка.
В твоем примере тоже самое "OnKeyDownCallbackDelegate" и "OnDeviceStateChangedCallbackDelegat e" не распознает.
[WPF] Подключение dll (ffmpeg)

Я в шапке оставил исходники. Если тебе удастся подключить их так, что бы все работало на c# wpf, я тебе хоть сотку дам.
0
22 / 21 / 11
Регистрация: 13.11.2016
Сообщений: 75
01.07.2017, 15:30
Естественно имена и сигнатуры у Вас будут другие, но LoadLibrary точно так же как здесь и ни каких ссылок на сбори не нужно только убедитесь что Ваши длл находятся либо в каталоге запускаемого приложения либо в системных каталогах.

Добавлено через 4 минуты
Правильно ругается таких типов со звёздочками в шарпе не бывает - имя на экземпляр ссылочного класса и так - ссылка на кучу.

Добавлено через 2 минуты
Возможно, что при написании длл которую Вы хотите импортировать ни кто не расчитывал что её захотят использовать в C# и тогда её нужно переделывать.

Добавлено через 7 минут
Извини но я не буду сейчас этим заниматься даже за сотку баксов. У меня свой проект есть над которым я работаю. Постарайтесь разобраться самостоятельно. На картинке в шапке он ругается потому что Вы импортируете не в статическом классе это значит что нужно не в майнвиндов это делать, а создать другой класс - обёртку со спецификатором static.
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
01.07.2017, 15:43  [ТС]
Цитата Сообщение от Padmasambhava Посмотреть сообщение
Естественно имена и сигнатуры у Вас будут другие, но LoadLibrary точно так же как здесь и ни каких ссылок на сбори не нужно только убедитесь что Ваши длл находятся либо в каталоге запускаемого приложения либо в системных каталогах.

Добавлено через 4 минуты
Правильно ругается таких типов со звёздочками в шарпе не бывает - имя на экземпляр ссылочного класса и так - ссылка на кучу.

Добавлено через 2 минуты
Возможно, что при написании длл которую Вы хотите импортировать ни кто не расчитывал что её захотят использовать в C# и тогда её нужно переделывать.

Добавлено через 7 минут
Извини но я не буду сейчас этим заниматься даже за сотку баксов. У меня свой проект есть над которым я работаю. Постарайтесь разобраться самостоятельно. На картинке в шапке он ругается потому что Вы импортируете не в статическом классе это значит что нужно не в майнвиндов это делать, а создать другой класс - обёртку со спецификатором static.
Даже при условии создания статик-класса не помогало.
Пишет, что не может найти те типы данных, что описаны в длл. Все длл распиханы во все щели...
Тут либо я тупой либо лыжи не едут. Хотя, выше кидали ссылку на гит с сборкой на впф c#, где все работает, но описания подключения там нет(хотя я уверен там юзаются ссылки, что не работают у меня)
0
22 / 21 / 11
Регистрация: 13.11.2016
Сообщений: 75
01.07.2017, 15:59
Цитата Сообщение от neokms Посмотреть сообщение
В твоем примере тоже самое "OnKeyDownCallbackDelegate" и "OnDeviceStateChangedCallbackDelegat e" не распознает.
Я в шапке оставил исходники. Если тебе удастся подключить их так, что бы все работало на c# wpf, я тебе хоть сотку дам.
В моём случае это делегаты объявленные чуть выше так:

C#
1
2
3
4
5
6
7
8
9
10
        #region Закрытые делегаты и их обработчики
        // Библиотека предоставляет данные делегаты. Здесь они закрытые
        // чтобы пользователь не работал напрямую с ними, а вешал свои
        // обработчики на публикуемые события
        private delegate void OnKeyDownCallbackDelegate(int key);
        private delegate void OnDeviceStateChangedCallbackDelegate(int state);
 
        private static OnKeyDownCallbackDelegate OnKeyDown;
        private static OnDeviceStateChangedCallbackDelegate OnDeviceStateChanged;
        #endregion
И поэтому в моём случае они приемлемого для с# типа, а не Сиплюсплюсные указатели и указатели на указатели как у Вас.

Добавлено через 6 минут
Цитата Сообщение от neokms Посмотреть сообщение
Даже при условии создания статик-класса не помогало.
Пишет, что не может найти те типы данных, что описаны в длл. Все длл распиханы во все щели...
Тут либо я тупой либо лыжи не едут. Хотя, выше кидали ссылку на гит с сборкой на впф c#, где все работает, но описания подключения там нет(хотя я уверен там юзаются ссылки, что не работают у меня)
При импорте нужно указать другие типы - не char* а char или char[], про остальные сказать не могу нужно смотреть библиотеку, а у меня и так пять проектов отрыто в VS - не до скачиваний сейчас.

Добавлено через 1 минуту
Ваши типы при импорте замените соответствующими типами из c# - на худой конец попробуйте object
0
Эксперт .NET
 Аватар для Usaga
12874 / 8913 / 1323
Регистрация: 21.01.2016
Сообщений: 33,478
02.07.2017, 05:39
Цитата Сообщение от neokms Посмотреть сообщение
Да яж говорил что не работает все это
Кто-нибудь может дать внятное решение данной проблемы?
Либо кто-нибудь обоснует, что не возможно подключить ffmpeg к c# (а это не так).
Во-первых, я русским языком объяснил, что есть управляемые сборки (которые подключаются ссылками), а есть неуправляемые (которые подключаются через P/invoke). ffmpeg - набор кодеков на Си, значит речь о неуправляемых сборках. Или работайте с ними напрямую через p/invoke (DllImport - это оно), либо ищите какую-нибудь interop-сборку.

Во-вторых, если у вас не получается, то это не значит, что вам посоветовали фигню. Судя по скриншотам с обшибками, вы едва ли понимаете, что делаете от слова совсем. Соответственно, единственный способ вам помочь - отправить читать про p/invoke в частности и про C# в целом, ибо вы явно не отличаете С# от C++.

Всё, обосновывать тут нечего.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2017, 05:39
Помогаю со студенческими работами здесь

Подключение OpenGL к WPF
Как подключить OpenGL к проекту C# WPF, используя NuGet?

Подключение шрифта в WPF
Добрый день. Подскажите пожалуйста как можно подключить свои шрифты в проест. В статье "Встраивание шрифтов"...

Can't load extension C:\php/ffmpeg.dll
Здравствуйте. Устанавливаю ffmpeg на сервер IIS+php. скачал архив ffmpeg-php-win32-all.zip Распаковал его. Библиотеку php_ffmpeg.dll...

Подключение библиотеки ffmpeg к проекту
Здравствуйте. Я начал разбираться с библиотекой ffmpeg. Но не пойму как ее можно подключить к проекту в С++ и можно ее подключить и...

Подключение ffmpeg к visual studio 2008
Пытаюсь подключить ffmpeg к Visual C++ по этому гайду После ввода "./configure --toolchain=msvc" вылетает ошибка: c99wrap cl is unable...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

Новые блоги и статьи
Система статов в Unity
GameUnited 20.04.2025
Статы — фундаментальный элемент игрового дизайна, который определяет характеристики персонажей, предметов и других объектов в игровом мире. Будь то показатель силы в RPG, скорость передвижения в. . .
Статические свойства и методы в TypeScript
run.dev 20.04.2025
TypeScript прочно занял своё место в системе современной веб-разработки. Этот строго типизированный язык программирования не просто расширяет возможности JavaScript — он делает разработку более. . .
Batch Transform и Batch Gizmo Drawing API в Unity
GameUnited 20.04.2025
В мире разработки игр и приложений на Unity производительность всегда была критическим фактором успеха. Создатели игр постоянно балансируют между визуальной привлекательностью и плавностью работы. . .
Звук в Unity: Рандомизация с Audio Random Container
GameUnited 20.04.2025
В современных играх звуковое оформление часто становится элементом, который либо полностью погружает игрока в виртуальный мир, либо разрушает атмосферу за считанные минуты. Представьте: вы исследуете. . .
Максимальная производительность C#: Советы, тестирование и заключение
stackOverflow 20.04.2025
Погружение в мир микрооптимизаций C# открывает перед разработчиком целый арсенал мощных техник. Но как определить, где и когда их применять? Ответ начинается с точных измерений и профилирования. . . .
Максимальная производительность C#: Предсказание ветвлений
stackOverflow 20.04.2025
Третий ключевой аспект низкоуровневой оптимизации — предсказание ветвлений. Эта тема менее известна среди разработчиков, но её влияние на производительность может быть колоссальным. Чтобы понять. . .
Максимальная производительность C#: Векторизация (SIMD)
stackOverflow 20.04.2025
Помимо работы с кэшем, другим ключевым аспектом низкоуровневой оптимизации является векторизация вычислений. SIMD (Single Instruction, Multiple Data) позволяет обрабатывать несколько элементов данных. . .
Максимальная производительность C#: Процессорный кэш
stackOverflow 20.04.2025
Знакомство с внутренним устройством процессорного кэша — ключевой шаг в написании по-настоящему быстрого кода на C#. Этот слой архитектуры компьютера часто ускользает от внимания разработчиков, но. . .
Максимальная производительность C#: Введение в микрооптимизации
stackOverflow 20.04.2025
В мире разработки на C# многие привыкли полагаться на . NET Runtime, который "магическим образом" сам оптимизирует код. И часто это работает - современные JIT-компиляторы творят чудеса. Но когда речь. . .
MVC фреймворк в PHP
Jason-Webb 19.04.2025
Архитектурный паттерн Model-View-Controller (MVC) – это не просто модный термин из мира веб-разработки. Для PHP-программистов это фундаментальный подход к организации кода, который радикально меняет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru