Electron沙盒应用程序中的Ffmpeg被中止

3
我有一个Electron应用程序,在Mac AppStore上发布并进行了沙箱处理。
我正在尝试添加一个新功能,以便在Electron环境中流式传输更多视频格式,这需要实时编码/解码视频。
我使用 fluent-ffmpegstatic exec of ffmpeg
一切都很完美,我已经将沙箱应用上传到Apple,但被拒绝了,因为ffmpeg默认使用安全传输协议,该协议使用非公共API。这是他们拒绝的原因: > 您的应用程序使用或引用以下非公开API: > '/ System / Library / Frameworks / Security.framework / Versions / A / Security' >:SecIdentityCreate 经过详细调查后,发现我必须自己编译ffmpeg,并使用 --disable-securetransport 标志。很容易,我使用与下载的静态构建相同的配置简单地添加了新标志。

我设法安装了所需的所有依赖项,除了 libxavs,我猜这没什么大不了的,只需从配置命令中删除其标志即可:

./configure \
--cc=/usr/bin/clang \
--prefix=/opt/ffmpeg \
--extra-version=tessus \
--enable-avisynth \
--enable-fontconfig \
--enable-gpl \
--enable-libass \
--enable-libbluray \
--enable-libfreetype \
--enable-libgsm \
--enable-libmodplug \
--enable-libmp3lame \
--enable-libopencore-amrnb \
--enable-libopencore-amrwb \
--enable-libopus \
--enable-libsnappy \
--enable-libsoxr \
--enable-libspeex \
--enable-libtheora \
--enable-libvidstab \
--enable-libvo-amrwbenc \
--enable-libvorbis \
--enable-libvpx \
--enable-libwavpack \
--enable-libx264 \
--enable-libx265 \
--enable-libxvid \
--enable-libzmq \
--enable-libzvbi \
--enable-version3 \
--pkg-config-flags=--static \
--disable-securetransport \
--disable-ffplay

使用新的ffmpeg exec,一切仍按预期工作。但是一旦我打包、签名和沙盒化应用程序,只要我尝试启动它,ffmpeg就会停止工作,抛出此错误:

An error occurred ffmpeg was killed with signal SIGABRT Error: ffmpeg was killed with signal SIGABRT
    at ChildProcess.eval (webpack:///../node_modules/fluent-ffmpeg/lib/processor.js?:180:22)
    at emitTwo (events.js:125:13)
    at ChildProcess.emit (events.js:213:7)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12)

我尝试删除--disable-securetransport标志,看看它是否会对某些东西造成影响,但结果相同。

我尝试在Linux机器上编译,只是想看看它是否有所帮助,但结果也一样。

只要我使用自定义编译的可执行文件,它就无法在沙盒中工作,但是当使用静态安装文件时,一切正常(之后我需要xattr它,因为它被隔离并在沙盒中被阻止)。

我唯一注意到的奇怪事情是,我的自定义编译只有20兆左右,而我下载的静态安装文件则为43兆。

我真的陷入了困境。


尝试添加 --enable-static--extra-ldflags=-static 进行编译。 - Gyan
谢谢,我正在尝试。但是无法使用--extra-ldflags=-static,总是出现关于“C编译器测试失败”和交叉编译的错误。我会尝试不使用这个选项。 - Yoann
你的全局CFLAGS和LDFLAGS是什么? - Gyan
我没有,我需要吗?(害怕问一个愚蠢的问题) - Yoann
ldd <your-exec> 显示了什么? - Gyan
显示剩余2条评论
1个回答

1
我终于成功编译了静态的ffmpeg可执行文件。
感谢this answer给出的解决方案。
显然,OSX有动态库位于/usr/local/bin,这些库优先于其他所有内容。因此,即使您尝试将ffmpeg编译为静态文件,它也无法与这些库一起使用。
一旦我删除了所有的/usr/local/bin/*.dylib,我的构建就变成了完全静态,并在沙箱中完美运行。

你好,我正在尝试解决这个确切的问题(在此报告:https://stackoverflow.com/questions/65474096/sandboxed-electron-app-cant-use-ffmpeg-mac-apple-store)。您在本地计算机构建本地的FFmpeg之前是否删除了文件?我正在尝试查找“/usr/local/bin/*.dylib”文件,但没有找到任何文件。 - Martin
我没有删除文件,只是将它们移动了一下,运行了配置脚本,然后又把它们放回去了。我在/usr/local/bin/*.dylib也没有看到它们,但我在/usr/lib/*.dylib中看到了很多。 也许它们在更新后被移动了,我的脚本是3年前的,肯定有所改变。 你能保持更新以便我可以添加解决方案吗? - Yoann
我正在尝试做这件事,但我无法从文件夹/usr/lib中写入或复制文件,这涉及到SIP苹果安全性?我正在尝试查看是否可以禁用此安全性。 - Martin
禁用了 SIP 安全性,并将所有 /usr/lib/*.dylib 文件移动到我的桌面上的另一个文件夹,但这导致我的终端和查找器窗口无法工作,无法打开笔记应用程序。可能需要恢复出厂设置。 - Martin
移动这些库的时间不应该超过编译脚本的持续时间。并且在编译完成后立即放回原位。我自己所做的是编写脚本,首先移动库,然后进行编译,最后将库放回原位。系统需要这些库。 - Yoann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接