FFmpeg Kit macOS Crash de Signature de Code
Problème
Une app Flutter macOS se compile avec succès mais crash immédiatement au lancement avec une erreur de chargement de bibliothèque. Le crash est causé par la variante Full GPL de FFmpeg Kit qui a des dépendances à l'exécution sur des bibliothèques installées via homebrew (comme fontconfig) qui échouent la validation de signature de code macOS.
Contexte / Conditions de Déclenchement
- Plateforme : macOS uniquement (iOS et Android ne sont pas affectés)
- Package : Utilisation de
ffmpeg_kit_flutter_new(variante Full GPL) - Symptôme : L'app se compile avec succès mais crash au lancement
- Le log de crash montre :
Library not loaded: /opt/homebrew/*/libfontconfig.1.dylib Referenced from: .../libswresample.framework/... Reason: code signature in (.../libfontconfig.1.dylib) not valid for use in process: mapping process and mapped file (non-platform) have different Team IDs
Cause Racine
Le package ffmpeg_kit_flutter_new est la variante « Full GPL » qui inclut de nombreuses bibliothèques FFmpeg pour des fonctionnalités avancées comme le rendu de texte (filtre drawtext). Ces bibliothèques ont des dépendances externes sur les polices système via libfontconfig.
Sur macOS, quand l'app tente de charger libswresample.framework, elle essaie aussi de charger libfontconfig.1.dylib depuis homebrew. La validation de signature de code macOS rejette ceci car la bibliothèque homebrew a un Team ID différent de celui de votre app.
Solution
Basculez de ffmpeg_kit_flutter_new (Full GPL) à ffmpeg_kit_flutter_new_min (Minimal).
Étape 1 : Mettre à jour pubspec.yaml
# Avant
ffmpeg_kit_flutter_new: ^3.2.0
# Après
ffmpeg_kit_flutter_new_min: ^3.1.0
Étape 2 : Mettre à jour les imports dans tous les fichiers Dart
// Avant
import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter_new/ffprobe_kit.dart';
import 'package:ffmpeg_kit_flutter_new/return_code.dart';
// Après
import 'package:ffmpeg_kit_flutter_new_min/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter_new_min/ffprobe_kit.dart';
import 'package:ffmpeg_kit_flutter_new_min/return_code.dart';
Étape 3 : Nettoyer et recompiler
flutter clean
rm -f macos/Podfile.lock
flutter pub get
flutter run -d macos
Fonctionnalités Conservées
La variante minimale inclut tout ce qui est nécessaire pour les apps vidéo typiques :
- h264/libx264 encodage vidéo
- AAC encodage audio
- VideoToolbox accélération matérielle (plateformes Apple)
- Filtres standard : overlay, crop, scale, concat, amix
- FFprobe pour l'information médias
Fonctionnalités Supprimées
La variante minimale n'inclut PAS :
- Filtre
drawtext(rendu de police) - utilisez des overlays PNG à la place - Bibliothèques de codecs avancées avec dépendances externes
- Fonctionnalités nécessitant fontconfig, freetype, etc.
Vérification
Après le correctif :
flutter run -d macosdevrait lancer l'app sans crash- Les opérations d'encodage/décodage vidéo devraient fonctionner normalement
- Les builds iOS continuent de fonctionner (elles n'étaient pas affectées)
Exemple
Trouver les fichiers nécessitant des mises à jour d'imports :
grep -r "ffmpeg_kit_flutter_new" lib/ --include="*.dart" -l
Mettre à jour tous les imports (exemple sed) :
find lib -name "*.dart" -exec sed -i '' \
's/ffmpeg_kit_flutter_new/ffmpeg_kit_flutter_new_min/g' {} \;
Notes
- Ce problème n'affecte que macOS ; iOS et Android n'ont pas les mêmes restrictions de signature de code
- Le message d'erreur est trompeur - il mentionne fontconfig mais le correctif est de changer les variantes de FFmpeg Kit
- Si vous avez vraiment besoin du filtre
drawtextsur macOS, vous devriez bundler fontconfig avec une signature correcte (complexe) - Alternative : Utilisez le
ffmpeg_kit_flutterofficiel d'arthenica si vous avez besoin de plus de contrôle sur les variantes