Flutter使用flutter_ffmpeg获取.m4b有声书章节数据的变量读取方法
方法1:直接读取ffmpeg命令输出(无需抓取控制台日志,推荐)
你当前执行的命令本身会把章节JSON输出到标准输出流,flutter_ffmpeg官方已经提供了直接获取该输出的接口,直接调用即可拿到JSON字符串转成变量使用,示例代码如下:
import 'dart:convert'; import 'package:flutter_ffmpeg/flutter_ffmpeg.dart'; final FlutterFFmpeg _flutterFFmpeg = FlutterFFmpeg(); // 异步执行ffmpeg命令 int returnCode = await _flutterFFmpeg.executeWithArguments([ '-i', widget.book.path, '-print_format', 'json', '-show_chapters', '-loglevel', 'error' ]); // 命令执行成功的情况 if (returnCode == 0) { // 直接获取命令输出的完整内容 String? ffmpegOutput = await _flutterFFmpeg.getLastOutput(); if (ffmpegOutput != null) { // 把JSON字符串解析为Dart对象直接使用 Map<String, dynamic> result = jsonDecode(ffmpegOutput); List<dynamic> chapterList = result['chapters'] ?? []; // 此处可直接对chapterList做业务逻辑处理 } }
你当前已经加了-loglevel error参数,会过滤掉所有无关日志,输出内容只有纯净的章节JSON,不需要额外做内容清理就能直接解析。
方法2:使用新版维护分支FFmpegKit
原flutter_ffmpeg包已经停止维护,官方已经迁移到ffmpeg_kit_flutter包,该包获取输出的逻辑更清晰,示例如下:
import 'dart:convert'; import 'package:ffmpeg_kit_flutter/ffmpeg_kit.dart'; FFmpegKit.executeWithArguments([ '-i', widget.book.path, '-print_format', 'json', '-show_chapters', '-loglevel', 'error' ]).then((session) async { final returnCode = await session.getReturnCode(); if (returnCode?.isValueSuccess() == true) { final output = await session.getOutput(); Map<String, dynamic> result = jsonDecode(output!); List<dynamic> chapterList = result['chapters'] ?? []; } });
注意事项
- 注意处理returnCode非0的异常场景,比如文件读取权限不足、源文件损坏的情况,避免解析空内容崩溃
- 不需要额外监听系统控制台日志,官方提供的输出接口已经能拿到完整的命令执行结果
内容的提问来源于stack exchange,提问作者Vlad-Sebastian Cretu
相关产品推荐
相关产品推荐

