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

我有一个支持 Mac 的 Xamarin Forms 项目,我正在尝试实现 FFmpeg,所以我从其官方页面下载了静态构建,并将其添加到 Mac 项目的资源文件夹中,并在内容中使用构建操作,然后我创建了一个服务,该服务将基本上从视频中删除音频,该视频在使用 FFmpeg 命令的路径中指示,以根据以下答案执行我所拥有的服务,并且我已将其调整为 C#: https://stackoverflow.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 "
  • 您是否尝试过使用不在您的项目资源中的其他路径?

标签: c# macos xamarin xamarin.forms 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,我还测试了 FfmpegCoreFFmpget.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 二进制文件,签署它们的程序是什么?
猜你喜欢
  • 2020-01-24
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多