我使用Windows、C#、FFmpeg.AutoGen。我想获取设备列表。
public static class Helpers
{
private static unsafe AVDeviceInfoList** _devicesList;
public static unsafe void GetMediaSourceNames()
{
ffmpeg.avdevice_register_all();
AVFormatContext* context = ffmpeg.avformat_alloc_context();
ffmpeg.avdevice_list_devices(context, _devicesList);
}
}
函数avdevice_list_devices()导致错误:
Microsoft Visual C++运行时库。此应用程序请求运行时以一种不寻常的方式终止它。
我做错了什么?
更新
错误的另一个原因:
Assertion s->oformat || s->iformat failed at src/libavdevice/avdevice.c:192
如果我们在调试中查看上下文,我们将看到context.oformat
和context.iformat
等于零。
更新2
如果设置一些非零值,则错误将消失。像这样:
AVInputFormat avformat = new AVInputFormat();
(*context).iformat = &avformat;
但无法获取设备列表。现在代码看起来像这样。最后一行抛出异常“Object reference not set to an instance of an object”。但是在调试中可以看到nb_devices
的值是十(实际上根本没有设备)。
public static class Helpers
{
private static unsafe AVDeviceInfoList* _devicesList;
public static unsafe void GetMediaSourcesNames()
{
ffmpeg.avdevice_register_all();
AVFormatContext* context = ffmpeg.avformat_alloc_context();
AVInputFormat avformat = new AVInputFormat();
(*context).iformat = &avformat;
fixed (AVDeviceInfoList** devicesListPointer = &_devicesList)
{
ffmpeg.avdevice_list_devices(context, devicesListPointer);
}
int devicesQuantity = (*_devicesList).nb_devices;
}
}
3条答案
按热度按时间rmbxnbpk1#
指针的用法是错误的。
将
private static unsafe AVDeviceInfoList** _devicesList;
替换为:将
ffmpeg.avdevice_list_devices(context, _devicesList);
替换为:avdevice_list_devices
参数被定义为指向指针的指针,这并不意味着我们可以用**
声明一个变量并将其作为参数传递。**
(指针到指针)的C语法非常混乱。在我们的例子中,这意味着我们应该传递一个指针的地址,函数返回一个新指针。
返回的指针指向设备列表。
该函数动态地分配用于存储列表的内存,填充列表,并返回指向列表的指针。
要释放分配的内存,请执行:
nhhxz33t2#
很可能无法通过代码获取设备列表。证明。但毕竟应用程序应该使用任何功能获取设备列表!
tcbh2hod3#
找到解决方案。需要使用较新版本的FFmpeg和不同的方法(avdevice_list_input_sources)。此代码适用于以下条件:Windows 7、.NETFramework 4.5.2、FFmpeg.AutoGen 5.1.2.3、来自gyan.dev的FFmpeg库5.1.2。