如何在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
相关产品推荐
相关产品推荐

