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

时间:2017-12-04 08:18:17

标签: javascript macos ffmpeg electron appstore-sandbox

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

我正在尝试添加一个新功能,可以动态编码/解码视频,以便在电子环境中传输更多视频格式。

我使用fluent-ffmpegstatic exec of ffmpeg

一切都运行得非常好,我已将沙盒应用程序上传到Apple,并被拒绝,因为ffmpeg默认使用的是使用非公共API的安全传输协议,这是他们发送给我的拒绝:

  

您的应用使用或引用了以下非公开API:

     

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

     

:SecIdentityCreate

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

我设法安装所需的所有依赖项,除了libxavs,我猜没什么大不了的,只需从configure命令中删除它的标志:

./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之后,因为{{ 3}})。

我唯一注意到的事情似乎很奇怪,我的自定义编译只有20mo左右,当我下载的静态安装是43mo时。

我真的坚持这个。

1 个答案:

答案 0 :(得分:0)

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

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

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

一旦我删除了所有/usr/local/bin/*.dylib我的版本变得完全静态并在沙盒中完美运行。