4

I am trying to release an electron app on the Mac Apple Store (mas), my electron app uses ffmpeg to render videos. In order to release my app on the mac apple store, It needs to be sandboxed, and by default ffmpeg makes calls to external libraries so I need to statically build ffmpeg and package it with my app. My code is on the 'mas-ffmpeg-fix' branch: https://github.com/MartinBarker/digify/tree/mas-ffmpeg-fix

My static ffmpeg build works before I build my app, but after running electron-builder build --mac, the ffmpeg executable now fails with Illegal instruction: 4

This is the full timeline of building/packaging/submitting my app to the mac apple store and where the error first appears:

  • In Digify repo:

  • clone, configure, and build static ffpmeg: “sudo rm -rf ffmpeg-mac/ && npm run download-ffmpeg”

  • download-ffmpeg command is inside package.json and runs this: git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg-mac && cd ffmpeg-mac && ./configure pkg_config='pkg-config --static' --pkg-config-flags='--static' --libdir=/usr/local/lib --extra-version=ntd_20150128 --disable-shared --disable-lzma --enable-gpl --enable-pthreads --enable-nonfree --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libx264 --enable-static --enable-filters --enable-runtime-cpudetect && make && cd ..

  • Check if any dylibb files in the static ffmpeg build with command: “otool -L ffmpeg-mac/ffmpeg | grep /usr/local”

  • If there are any, move them to folder in desktop, run ‘otool’ again to ensure there are no dynamic libraries, rebuild static ffmpeg.

  • there will now be a folder 'ffmpeg-mac' which contains static versions of ffmpeg and ffprobe

Using ffmpeg with electron UI: works Using Ffmpeg with command-line command: /Users/martinbarker/Documents/projects/digify-new/ffmpeg-mac/ffmpeg -h Works

  • Build mac mass app with “npm run build-mas“
  • When this command finishes it will output two files inside the /dist/mas/ folder: Digify.app and Digify-01.20.pkg (or whatever version number it is) Ffmpeg command-line check: /Users/martinbarker/Documents/projects/digify-new/dist/mas/Digify.app/Contents/Resources/ffmpeg -h Illegal instruction: 4

This is the first place the error appears, after building my mac mac-apple-store app, ffmpeg fails with this err.

  • Sign built app with .sh file: “sh mas-sign-script.sh” view .sh file here
    • the .sh file will output Digify-mac.pkg
  • Easier command to both build & sign: “sudo rm -rf dist/mas/ && npm run build-mas && sh mas-sign-script.sh”
  • Upload the outputted “Digify-mac.pkg” file & submit to apple for review

Once this app gets published in the store, if you download it and try to run an ffmpeg command with the electron UI, it fails with this error:

/Applications/Digify.app/Contents/Resources/app.asar/node_modules/execa/lib/error.js:59 Uncaught (in promise) Error: Command failed with exit code 1: /Applications/Digify.app/Contents/Resources/ffmpeg -i /Users/martinbarker/Downloads/Felix Lebarty - Bobo/01. Bobo.mp3 -y -filter_complex concat=n=1:v=0:a=1 -c:a libmp3lame -b:a 320k /Users/martinbarker/Downloads/Felix Lebarty - Bobo/output-064237.mp3
ffmpeg version N-101191-g51a9f487ae-ntd_20150128 Copyright (c) 2000-2021 the FFmpeg developers
  built with Apple LLVM version 10.0.1 (clang-1001.0.46.4)
  configuration: pkg_config='pkg-config --static' --pkg-config-flags=--static --libdir=/usr/local/lib --extra-version=ntd_20150128 --disable-shared --disable-lzma --enable-gpl --enable-pthreads --enable-nonfree --disable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libx264 --enable-static --enable-filters --enable-runtime-cpudetect
  libavutil      56. 65.100 / 56. 65.100
  libavcodec     58.125.100 / 58.125.100
  libavformat    58. 68.100 / 58. 68.100
  libavdevice    58. 12.100 / 58. 12.100
  libavfilter     7.107.100 /  7.107.100
  libswscale      5.  8.100 /  5.  8.100
  libswresample   3.  8.100 /  3.  8.100
  libpostproc    55.  8.100 / 55.  8.100
[mp3 @ 0x7feeae809c00] Estimating duration from bitrate, this may be inaccurate
Input #0, mp3, from '/Users/martinbarker/Downloads/Felix Lebarty - Bobo/01. Bobo.mp3':
  Metadata:
    comment         : 
    album           : Bobo
    artist          : Felix Lebarty
    title           : Funkytown Eklablog
    genre           : Boogie
    date            : 1984
  Duration: 00:05:19.53, start: 0.000000, bitrate: 320 kb/s
  Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 320 kb/s
/Users/martinbarker/Downloads/Felix Lebarty - Bobo/output-064237.mp3: Operation not permitted
    at makeError (/Applications/Digify.app/Contents/Resources/app.asar/node_modules/execa/lib/error.js:59)
    at handlePromise (/Applications/Digify.app/Contents/Resources/app.asar/node_modules/execa/index.js:114)
    at async file:/Applications/Digify.app/Contents/Resources/app.asar/src/js/newindex.js:1162

Command failed with exit code 1: Operation not permitted

5
  • Put ALL file names inside quotation marks " ". Reason: file names include space characters and special characters like -. Example: -i "/Users/martinbarker/Downloads/Felix Lebarty - Bobo/06. Special Lady.mp3" (similar for output file name). I suppose it is the answer - please try it.
    – sidcoder
    Commented Feb 23, 2021 at 13:03
  • I will try this after work and report back, thank you
    – Martin
    Commented Feb 23, 2021 at 19:33
  • even with inputs encased in quotation marks it still fails
    – Martin
    Commented Feb 26, 2021 at 3:31
  • @Martin Maybe you're binary is not entitled to some read/write location in the code signature? Commented Feb 27, 2021 at 18:32
  • if you go to my package.json ( github.com/MartinBarker/digify/blob/mas-ffmpeg-fix/package.json ) and ctrl+f for "mas": you'll see the mas build settings, and there's alot of detail for directories to include and such, i copied it from the mas build info of lossless-cut but had to change some parts around to fit my structure, maybe I need to look back at how lossless-cut did it because thats an example of an electron app with ffmpeg on the mac apple store that works
    – Martin
    Commented Feb 27, 2021 at 21:05

1 Answer 1

1

Turns out in electron you need to pick the output folder directory first with a file browser window before ffmpeg can write any files

Not the answer you're looking for? Browse other questions tagged or ask your own question.