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

如何在Flutter中使用ffmpeg-kit提取视频中的音频

如何在Flutter中使用ffmpeg-kit提取视频音频

你的代码存在几个关键问题导致无法正常提取音频,下面是完整的实现步骤和修正后的代码:

1. 添加依赖

在pubspec.yaml中添加ffmpeg-kit依赖,推荐使用针对音频优化的轻量版本以减小包体积:

dependencies:
  ffmpeg_kit_flutter_min_gpl: ^5.1.0
  path_provider: ^2.1.1

执行flutter pub get完成依赖安装。

2. 核心问题说明

  • 路径错误:Flutter的assets目录是只读的,不能直接写入文件,必须先将视频复制到应用的可读写目录(如文档目录)再处理。
  • 命令冗余:FFmpegKit.execute无需在命令前加ffmpeg前缀,工具会自动调用ffmpeg核心。
  • 异步逻辑混乱:避免await与then混用,保持代码简洁易读。

3. 完整实现代码

import 'package:flutter/material.dart';
import 'package:ffmpeg_kit_flutter_min_gpl/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter_min_gpl/return_code.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'dart:io';

class AudioExtractorPage extends StatefulWidget {
  const AudioExtractorPage({super.key});

  @override
  State<AudioExtractorPage> createState() => _AudioExtractorPageState();
}

class _AudioExtractorPageState extends State<AudioExtractorPage> {
  @override
  void initState() {
    super.initState();
    // 等待UI初始化完成后执行提取操作
    WidgetsBinding.instance.addPostFrameCallback((_) => extractAudio());
  }

  Future<void> extractAudio() async {
    // 获取应用可读写的文档目录
    final appDir = await getApplicationDocumentsDirectory();
    final inputVideoPath = '${appDir.path}/flutter.mp4';
    final outputAudioPath = '${appDir.path}/flutter_audio.mp3';

    // 从assets复制视频文件到可读写目录
    final videoAsset = await rootBundle.load('assets/videos/flutter.mp4');
    final videoFile = File(inputVideoPath);
    await videoFile.writeAsBytes(videoAsset.buffer.asUint8List());

    // 执行音频提取命令:-q:a 0表示最高质量音频,-map a仅提取音频流
    final session = await FFmpegKit.execute(
      "-i $inputVideoPath -q:a 0 -map a $outputAudioPath"
    );

    // 处理执行结果
    final returnCode = await session.getReturnCode();
    if (ReturnCode.isSuccess(returnCode)) {
      print('音频提取成功,文件路径:$outputAudioPath');
      // 可在此添加后续逻辑,比如播放音频、上传文件等
    } else {
      // 获取错误日志用于排查问题
      final errorLog = await session.getAllLogsAsString();
      print('提取失败,错误信息:$errorLog');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('音频提取')),
      body: const Center(child: Text('正在提取音频...')),
    );
  }
}

4. Android权限配置

针对Android 12及以下版本,在android/app/src/main/AndroidManifest.xml中添加存储权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>

Android 13+ 无需额外权限,应用自身文档目录默认支持读写操作。

内容的提问来源于stack exchange,提问作者Aqib Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:50:27