You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#代码无法加载gstreamer-1.0-0.dll的问题求助

问题描述
  • 环境:Windows 11 + Visual Studio 2022 + GStreamer Sharp(通过NuGet包gstreamer-sharp-netcore v0.0.8) + mingw_x86_64版本的GStreamer(已安装DEV和MSI包)
  • 项目配置(.csproj):
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
   <TargetFramework>net6.0</TargetFramework>
   <ImplicitUsings>enable</ImplicitUsings>
   <Nullable>enable</Nullable>
 </PropertyGroup>

 <ItemGroup>
   <PackageReference Include="gstreamer-sharp-netcore" Version="0.0.8" />
 </ItemGroup>
</Project>
  • 报错情况:调用var rtspsrc = ElementFactory.Make("rtspsrc", "source");时触发错误:

Error: Unable to load DLL 'gstreamer-1.0-0.dll' or one of its dependencies: Não foi possível encontrar o módulo especificado. (0x8007007E)

  • 异常现象:调用var pipeline = Parse.Launch("playbin uri=http://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4");时程序正常运行
  • 需求:使用GStreamer生成.ts和.m3u8文件
原因分析
  1. 位数不匹配:VS默认项目可能设置为AnyCPU,自动以32位模式运行,但你安装的是mingw_x86_64(64位)版本的GStreamer,导致无法加载64位的gstreamer-1.0-0.dll
  2. 环境变量未生效:添加GStreamer的bin路径到系统Path后,未重启Visual Studio——VS启动时会缓存环境变量,不重启无法读取新的路径配置
  3. 插件缺失:rtspsrc属于gst-plugins-good插件集,若GStreamer安装时未勾选该组件,会导致找不到依赖的插件库
  4. 延迟加载差异:Parse.Launch("playbin")能运行,是因为playbin依赖的核心库可能被提前加载,而ElementFactory.Make直接请求rtspsrc插件,触发了未加载的依赖
解决方案

1. 强制匹配目标平台

打开VS项目属性 → 生成 → 目标平台,选择x64(与mingw_x86_64的GStreamer位数一致),取消勾选“首选32位”

2. 刷新环境变量并重启VS

  • 将GStreamer的bin路径(默认是C:\gstreamer\1.0\mingw_x86_64\bin)添加到系统环境变量Path的最前端
  • 完全关闭并重启Visual Studio,确保新的环境变量生效

3. 确认插件安装

检查GStreamer安装目录下的C:\gstreamer\1.0\mingw_x86_64\lib\gstreamer-1.0是否存在gstrtspsrc.dll:

  • 若不存在,重新运行GStreamer的MSI安装包,在组件选择界面勾选gst-plugins-good(包含rtspsrc等常用插件)

4. 手动指定DLL搜索路径(备选方案)

如果环境变量仍不生效,在程序启动时手动设置DLL搜索路径:

using System.Runtime.InteropServices;

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);

// 在Main函数最开头调用
SetDllDirectory(@"C:\gstreamer\1.0\mingw_x86_64\bin");

5. 验证GStreamer本身可用性

打开命令提示符,运行gst-inspect-1.0 rtspsrc:

  • 若能输出rtspsrc插件的详细信息,说明GStreamer本身配置正常,问题出在.NET程序的加载逻辑
生成.ts和.m3u8的示例代码

以下是基于GStreamer Sharp的RTSP流转HLS(生成.ts分片和.m3u8播放列表)的完整示例:

using Gst;
using Gst.PbUtils;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool SetDllDirectory(string lpPathName);

    static void Main(string[] args)
    {
        // 手动设置DLL路径(根据实际安装路径调整)
        SetDllDirectory(@"C:\gstreamer\1.0\mingw_x86_64\bin");

        // 初始化GStreamer
        Application.Init();

        // 创建管道
        var pipeline = new Pipeline("rtsp-to-hls");

        // 创建各个元素
        var rtspsrc = ElementFactory.Make("rtspsrc", "rtsp-source");
        var decodebin = ElementFactory.Make("decodebin", "video-decoder");
        var x264enc = ElementFactory.Make("x264enc", "h264-encoder");
        var mpegtsmux = ElementFactory.Make("mpegtsmux", "ts-muxer");
        var hlssink = ElementFactory.Make("hlssink", "hls-sink");

        // 设置参数
        rtspsrc.SetProperty("location", "rtsp://your-rtsp-stream-url"); // 替换为你的RTSP流地址
        hlssink.SetProperty("location", "./output_%05d.ts"); // TS分片文件路径
        hlssink.SetProperty("playlist-location", "./output.m3u8"); // M3U8播放列表路径
        hlssink.SetProperty("target-duration", 5); // 每个TS分片的时长(秒)
        hlssink.SetProperty("max-files", 10); // 保留的最大分片数量

        // 将元素添加到管道
        pipeline.Add(rtspsrc, decodebin, x264enc, mpegtsmux, hlssink);

        // 链接rtspsrc到decodebin
        if (!rtspsrc.Link(decodebin))
        {
            Console.WriteLine("Failed to link rtspsrc to decodebin");
            return;
        }

        // 处理decodebin的动态pad链接(因为decodebin的输出pad是动态生成的)
        decodebin.PadAdded += (sender, e) =>
        {
            var padCaps = e.Pad.Caps.ToString();
            if (padCaps.StartsWith("video/x-raw"))
            {
                var encoderSinkPad = x264enc.GetStaticPad("sink");
                if (!encoderSinkPad.IsLinked)
                {
                    e.Pad.Link(encoderSinkPad);
                }
            }
        };

        // 链接后续元素
        if (!x264enc.Link(mpegtsmux) || !mpegtsmux.Link(hlssink))
        {
            Console.WriteLine("Failed to link elements");
            return;
        }

        // 启动管道
        var stateChangeReturn = pipeline.SetState(State.Playing);
        if (stateChangeReturn == StateChangeReturn.Failure)
        {
            Console.WriteLine("Failed to start pipeline");
            return;
        }

        // 等待用户输入停止程序
        Console.WriteLine("Pipeline running. Press any key to stop...");
        Console.ReadKey();

        // 停止并清理管道
        pipeline.SetState(State.Null);
        Application.Quit();
    }
}

内容的提问来源于stack exchange,提问作者Leonardo Alves moreno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:38:11