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

Ffmpeg gets aborted in an Electron sandboxed application

我有一个 Electron 应用程序,已发布在 Mac AppStore 上,并且已沙盒化。

我正在尝试添加一项新功能,该功能会 encode/decode 播放视频,这样我就可以在 Electron 上下文中流式传输更多视频格式。

我正在使用 fluent-ffmpeg and a static exec of ffmpeg

一切正常,我已经将沙盒应用程序上传到 Apple,但被拒绝了,因为 ffmpeg 默认使用安全传输协议,该协议使用非 public API,这是他们发给我的拒绝邮件:

Your app uses or references the following non-public API(s):

'/System/Library/Frameworks/Security.framework/Versions/A/Security'

: SecIdentityCreate

好吧,经过大量调查,看来我必须自己用 --disable-securetransport 标志编译 ffmpeg。很简单,我使用与我下载的静态构建相同的配置来完成它,只需添加新标志即可。

我设法安装了所有需要的依赖项,除了 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 机器上编译,只是想看看它是否有帮助,同样的事情。

只要我使用自定义编译的 exec,它就不能在沙箱中工作,但是当使用静态的时,一切正常(在我 xattr 它之后,因为 it's quarantined and blocked in sandbox).

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

我真的被这个困住了。

所以我终于能够编译我的静态 ffmpeg 可执行文件。

感谢 this answer,我找到了解决方案。

显然,OSX 的动态库位于 /usr/local/bin 中,它优先于其他所有内容。因此,即使您尝试将 ffmpeg 编译为静态的,它也不会在途中与这些库一起使用。

一旦我删除了所有这些 /usr/local/bin/*.dylib 我的构建就变成了完全静态的并且在沙盒中完美运行。