You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中FFmpegKitFlutter报MissingPluginException问题求助

解决Flutter中ffmpeg_kit_flutter的MissingPluginException问题

问题描述

使用ffmpeg_kit_flutter: ^6.0.3编写音频压缩函数时,触发以下错误:

Error: MissingPluginException(No implementation found for method ffmpegSession on channel flutter.arthenica.com/ffmpeg_kit)

栈追踪显示错误源于平台通道方法未找到,推测与插件原生端未正确集成或初始化有关。

解决方案

1. 清理并重新同步依赖

执行以下命令清理缓存并重新获取依赖:

flutter clean
flutter pub get

2. 重新构建原生项目

  • Android端:
    进入项目android目录,执行:
    ./gradlew clean
    
    返回根目录后重新运行flutter run。
  • iOS端:
    进入项目ios目录,执行:
    pod deintegrate && pod install
    
    完成后重新运行flutter run。

3. 确保插件初始化时机正确

在main函数中先初始化Flutter引擎,避免提前调用FFmpeg相关方法:

import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const YourApp());
}

4. 替换为全功能变体插件

基础版ffmpeg_kit_flutter可能缺少必要的原生实现,尝试改用全功能版本:
修改pubspec.yaml中的依赖:

dependencies:
  # 替换原有依赖
  ffmpeg_kit_flutter_full: ^6.0.3

之后再次执行flutter clean和flutter pub get。

5. 检查平台权限配置

  • Android:在android/app/src/main/AndroidManifest.xml中添加文件读写权限:
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- Android 13+ 需添加 -->
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
    
  • iOS:在ios/Runner/Info.plist中添加权限描述:
    <key>NSFileProviderDomainUsageDescription</key>
    <string>需要访问音频文件进行压缩处理</string>
    

参考代码与错误信息

音频压缩函数

import 'package:ffmpeg_kit_flutter/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter/return_code.dart';

Future<String> compressAudio(String inputPath) async {
    try {
      // 省略outputPath和_config的定义逻辑
      final command = '-y -i "$inputPath" ' // Input file
          '-af "loudnorm=I=-16:TP=-1.5:LRA=11,' // Loudness normalization
          'acompressor=threshold=${_config['threshold_db']}:'
          'ratio=${_config['ratio']}:'
          'attack=${_config['attack']}:'
          'release=${_config['release']},'
          'highpass=f=20,lowpass=f=20000" ' // Audio filters
          '-ar 44100 ' // Sample rate
          '-b:a 128k ' // Bitrate
          '-codec:a libmp3lame ' // MP3 encoder
          '-q:a 2 ' // Quality setting for LAME (0-9, lower is better)
          '-map_metadata 0 ' // Copy metadata
          '"$outputPath"'; // Output file

      // Execute FFmpeg command
      final session = await FFmpegKit.execute(command);
      final returnCode = await session.getReturnCode();
      final logs = await session.getLogs();
      print('FFmpeg logs: $logs');

      if (ReturnCode.isSuccess(returnCode)) {
        return outputFileName;
      } else {
        final logs = await session.getLogs();
        throw Exception(
            'FFmpeg process failed with code $returnCode\nLogs: $logs');
      }
    } catch (e, stackTrace) {
      print('Error: $e');
      print('Stack trace: $stackTrace');
      throw Exception('Failed to compress audio: $e\nStack trace: $stackTrace');
    }
  }

完整错误栈追踪

flutter: Error: MissingPluginException(No implementation found for method ffmpegSession on channel flutter.arthenica.com/ffmpeg_kit)
flutter: Stack trace: #0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:332:7)
<asynchronous suspension>
#1      AbstractSession.createFFmpegSession (package:ffmpeg_kit_flutter/abstract_session.dart:71:11)
<asynchronous suspension>
#2      FFmpegSession.create (package:ffmpeg_kit_flutter/ffmpeg_session.dart:40:21)
<asynchronous suspension>
#3      FFmpegKit.executeWithArguments (package:ffmpeg_kit_flutter/ffmpeg_kit.dart:44:9)
<asynchronous suspension>
#4      FileProcessor.compressAudio (package:predigt_upload_fl/file.dart:182:23)
<asynchronous suspension>
#5      _DetailPageState._handleSubmit (package:predigt_upload_fl/GUIs/LiveStreamDetailPage.dart:334:30)
<asynchronous suspension>


══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
flutter.arthenica.com/ffmpeg_kit_event)

When the exception was thrown, this was the stack:
#0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:332:7)
<asynchronous suspension>
#1      EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:676:9)        
<asynchronous suspension>

内容的提问来源于stack exchange,提问作者7Solomon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:54:55