У меня есть приложение Electron, опубликованное в Mac AppStore, и песочница.
Я пытаюсь добавить новую функцию, которая будет кодировать/декодировать видео на лету, чтобы я мог передавать больше видеоформатов в электронном контексте.
Я использую fluent-ffmpeg и статический exec ffmpeg.
Все работает отлично, я загрузил приложение для песочницы в Apple и получил отклонение, потому что ffmpeg по умолчанию использует безопасный транспортный протокол, который использует непубличный API, это то, что они отправили мне с отказом:
Ваше приложение использует или ссылается на следующие непубличные API (ы):
'/System/Library/Frameworks/Security.framework/Versions/A/Security'
: SecIdentityCreate
Хорошо, после большого расследования, похоже, что мне нужно скомпилировать ffmpeg с флагом --disable-securetransport
. Достаточно легко, я делаю это, используя ту же конфигурацию, что и статическая сборка, которую я загрузил, просто добавляя новый флаг.
Мне удаётся установить все зависимости, за исключением libxavs
, без больших 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
, посмотреть, может ли он что --disable-securetransport
, тот же результат.
Я попытался скомпилировать на машине Linux, просто чтобы убедиться, что это может помочь, то же самое.
Как только я использую свой собственный скомпилированный exec, он не работает в песочнице, но при использовании статического, все в порядке (после того, как я его xattr
, потому что он помещен на карантин и заблокирован в песочнице).
Единственное, что я заметил, кажется странным, так это то, что моя пользовательская компиляция составляет всего 20 или около того, когда статическая установка, которую я загрузил, составляет 43 м.
Я действительно застрял в этом.
Поэтому я, наконец, смог скомпилировать мой статический исполняемый файл ffmpeg.
Я нашел свое решение благодаря этому ответу.
По-видимому, OSX имеет динамические библиотеки, расположенные в /usr/local/bin
которые имеют приоритет над всем остальным. Поэтому, даже если вы попытаетесь скомпилировать ваш ffmpeg как статичный, он не будет работать с этими библиотеками на этом пути.
Как только я удалю все эти /usr/local/bin/*.dylib
моя сборка стала полностью статической и отлично работала в песочнице.
--extra-ldflags=-static
--enable-static
и--extra-ldflags=-static
.--extra-ldflags=-static
менее, всегда получаю сообщение об ошибке «Сбой теста компилятора» и кросс-компиляции. Пытаюсь без.