Xamarin Mac FFmpeg 启动路径无法访问

Posted

技术标签:

【中文标题】Xamarin Mac FFmpeg 启动路径无法访问【英文标题】:Xamarin Mac FFmpeg launch path not accessible 【发布时间】:2021-12-05 14:38:36 【问题描述】:

我有一个支持 Mac 的 Xamarin Forms 项目,我正在尝试实现 FFmpeg,所以我从其官方页面下载了静态构建,并将其添加到 Mac 项目的资源文件夹中,并在内容中使用构建操作,然后我创建了一个服务,该服务将基本上从视频中删除音频,该视频在使用 FFmpeg 命令的路径中指示,以根据以下答案执行我所拥有的服务,并且我已将其调整为 C#: https://***.com/a/37422688/8496520

问题是当我尝试执行命令时出现以下错误:

"NSInvalidArgumentException: launch path not accessible"

而且我也不知道为什么会这样,我在服务中使用了如下代码(调用NSTask的Launch()方法时出错):

public void ExecuteFFmpeg()

    try
    
        var launchPath = NSBundle.MainBundle.PathForResource("ffmpeg", ofType: "");
        var compressTask = new NSTask();
        compressTask.LaunchPath = launchPath;
        compressTask.Arguments = new string[] 
            "-i",
            "downloads/tyson.mp4",
            "-c",
            "copy",
            "-an",
            "nosound.mp4" ;
        compressTask.StandardInput = NSFileHandle.FromNullDevice();
        compressTask.Launch();
        compressTask.WaitUntilExit();
    
    catch (Exception ex)
    

    

我还将项目上传到 GitHub,以防有人需要完整地查阅存储库:https://github.com/nacompllo/FFmpegSample

【问题讨论】:

launchpath的值是多少? @Jason 是我在Content中配置了构建动作的resources文件夹中添加的FFmpeg静态编译的路径,也就是说在本例中:“/Users/tecnopresley/FFmpegSample /FFmpegSample/FFmpegSample.MacOS/bin/Debug/FFmpegSample.MacOS.app/Contents/Resources/ffmpeg " 您是否尝试过使用不在您的项目资源中的其他路径? 【参考方案1】:

如果您未绑定到 NSTask,则可以改用 CliWrapper。

public static async ValueTask FfmpegRemoveAudio(string ffmpegPath, string inputFilePath, string outputFilePath)

    await Cli.Wrap(ffmpegPath).WithArguments(new[]  "-i", inputFilePath, "-c", "copy", "-an", outputFilePath ).ExecuteAsync();

除了 CliWrapper,我还测试了 FfmpegCore 和 FFmpget.NET,它们也抛出了一些类似的异常,就像你描述的那样。我没有胶水,为什么他们的行为不同。有关详细信息,请参阅完整的工作 POC。

【讨论】:

当控制台应用程序尝试打开ffmpeg时出现以下错误:“ffmpeg无法打开,因为无法验证开发者”。使静态编译安全的方法是什么?我必须对所有静态构建进行公证吗?我正在寻找的是用户不必授予权限,并且尽可能以最自动的方式进行。 似乎 ffmpeg 错过了签署他们的二进制文件,并且签名验证似乎在 githubactions 构建代理上被禁用(我测试了你的二进制文件github.com/stesee/GithubActionsHelloWorld/actions)。您需要获取签名的 ffmpeg 二进制文件,自己签名,或禁用系统上的签名验证......也许这是您最初错误的根本原因。 我正在尝试使用 CliWrapper 和以下命令禁用系统上的签名验证:“sudo spctl --master-disable”,CliWrapper 有什么方法不需要输入系统密码输入带有“sudo”的命令时? 这对于生产来说可能没什么,但是在 dev 上你需要添加一个 /etc/sudoers 条目,以禁用 sodo 请求。 我可以确认您的代码工作正常,我很感激。但是我只有最后一个问题,我找不到任何分发已经签名的 ffmpeg 二进制文件的站点,你知道有什么地方可以让它们已经签名吗?如果没有,签署它们的方式是什么?我有我的 Xamarin.Forms 应用程序签名和公证,但这些 ffmpeg 二进制文件,签署它们的程序是什么?

以上是关于Xamarin Mac FFmpeg 启动路径无法访问的主要内容,如果未能解决你的问题,请参考以下文章

从 Visual Studio 2019 Xamarin.iOS 连接到 Mac 的代理问题

“无法启动 Visual Studio”错误(在 Mac 上)

VS Xamarin '无法连接到 Mac.local'

Xamarin部署错误HE0004 DADocSetManagement

Xamarin VS 2017 无法呈现 iOS 故事板文档

AppIcon 无法在 IOS 上使用 xamarin / Visual Studio Mac 显示,但可以使用 xcode