Flutter视频处理插件ffmpeg_helper的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter视频处理插件ffmpeg_helper的使用

ffmpeg_helper是一个用于Flutter的FFmpeg命令助手插件,支持在Windows平台上进行设置。它可以在除WEB以外的所有平台上创建缩略图和运行ffprobe。该插件使用ffmpeg_kit_flutter_min_gpl包来支持Android、iOS和macOS平台。

初始化

首先,在main函数中初始化ffmpeg_helper插件:

import 'package:ffmpeg_helper/ffmpeg_helper.dart';
import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await FFMpegHelper.instance.initialize(); // 初始化FFMpegHelper
  runApp(const MyApp());
}

创建一个FFmpeg命令

你可以使用预构建的参数和过滤器,或者创建自定义的命令。以下是一个示例,展示了如何创建一个FFmpeg命令来剪辑视频并调整其大小:

import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:ffmpeg_helper/ffmpeg_helper.dart';

Future<void> processVideo(String videoPath) async {
  final appDocDir = await getApplicationDocumentsDirectory();
  final outputFilePath = path.join(appDocDir.path, "output.mp4");

  final cliCommand = FFMpegCommand(
    inputs: [
      FFMpegInput.asset(videoPath),
    ],
    args: [
      const LogLevelArgument(LogLevel.info),
      const OverwriteArgument(),
      const TrimArgument(start: Duration(seconds: 0), end: Duration(seconds: 10)),
    ],
    filterGraph: FilterGraph(
      chains: [
        FilterChain(
          filters: [
            ScaleFilter(height: 300, width: -2),
          ],
        ),
      ],
    ),
    outputFilepath: outputFilePath,
  );

  FFMpegHelperSession session = await ffmpeg.runAsync(
    cliCommand,
    statisticsCallback: (Statistics statistics) {
      print('bitrate: ${statistics.getBitrate()}');
    },
  );

  // 等待任务完成
  await session.onComplete;
}

创建缩略图

你可以使用getThumbnailFileAsyncgetThumbnailFileSync方法来生成视频的缩略图:

Future<File?> createThumbnail(String videoPath) async {
  final appDocDir = await getApplicationDocumentsDirectory();
  final outputPath = path.join(appDocDir.path, "thumbnail.jpg");

  return await ffmpeg.getThumbnailFileSync(
    videoPath: videoPath,
    fromDuration: Duration(seconds: 5),
    outputPath: outputPath,
    qualityPercentage: 90,
  );
}

运行FFmpeg并获取会话

如果你想运行FFmpeg并获取一个可以稍后取消的任务会话,可以使用runAsync方法:

Future<FFMpegHelperSession> runFfmpegAsync(FFMpegCommand command) async {
  return await ffmpeg.runAsync(
    command,
    statisticsCallback: (Statistics statistics) {
      print('bitrate: ${statistics.getBitrate()}');
    },
  );
}

运行FFmpeg作为Future

如果你希望直接运行FFmpeg并等待结果,可以使用runSync方法:

Future<File?> runFfmpegSync(FFMpegCommand command) async {
  return await ffmpeg.runSync(
    command,
    statisticsCallback: (Statistics statistics) {
      print('bitrate: ${statistics.getBitrate()}');
    },
  );
}

运行ffprobe

你可以使用runProbe方法来获取媒体文件的信息:

Future<MediaInformation?> getMediaInfo(String filePath) async {
  return await ffmpeg.runProbe(filePath);
}

设置FFmpeg

在Linux上安装FFmpeg

你可以通过以下命令之一安装FFmpeg:

sudo apt-get install ffmpeg
# 或者
sudo snap install ffmpeg

这取决于你的Linux发行版。

在Windows上安装FFmpeg

如果在Windows上没有找到FFmpeg,插件会自动下载官方的ZIP文件并解压到应用文档目录:

Future<void> downloadFFMpeg() async {
  if (Platform.isWindows) {
    bool success = await ffmpeg.setupFFMpegOnWindows(
      onProgress: (FFMpegProgress progress) {
        print('Downloaded: ${progress.downloaded}, Total: ${progress.fileSize}');
      },
    );
    setState(() {
      ffmpegPresent = success;
    });
  }
}

示例Demo

下面是一个完整的示例代码,展示了如何在Flutter应用中使用ffmpeg_helper插件:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:ffmpeg_helper/ffmpeg_helper.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await FFMpegHelper.instance.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'FFmpeg Helper Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String? _thumbnailPath;

  Future<void> _processVideo() async {
    final videoPath = 'path/to/your/video.mp4';
    await processVideo(videoPath);
    final thumbnailFile = await createThumbnail(videoPath);
    setState(() {
      _thumbnailPath = thumbnailFile?.path;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('FFmpeg Helper Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _processVideo,
              child: Text('Process Video and Create Thumbnail'),
            ),
            if (_thumbnailPath != null)
              Image.file(File(_thumbnailPath!)),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter视频处理插件ffmpeg_helper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视频处理插件ffmpeg_helper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用ffmpeg_helper插件进行视频处理的代码示例。ffmpeg_helper是一个用于在Flutter应用中集成FFmpeg的插件,可以执行各种视频和音频处理任务。

首先,确保你已经在pubspec.yaml文件中添加了ffmpeg_helper依赖:

dependencies:
  flutter:
    sdk: flutter
  ffmpeg_helper: ^0.4.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

示例代码

1. 配置FFmpeg(可选)

在某些情况下,你可能需要配置FFmpeg的路径或参数。在Android和iOS平台上,这通常是在初始化应用时完成的。

import 'package:flutter/material.dart';
import 'package:ffmpeg_helper/ffmpeg_helper.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('FFmpeg Helper Example'),
        ),
        body: FFmpegExample(),
      ),
    );
  }
}

class FFmpegExample extends StatefulWidget {
  @override
  _FFmpegExampleState createState() => _FFmpegExampleState();
}

class _FFmpegExampleState extends State<FFmpegExample> {
  @override
  void initState() {
    super.initState();
    // 配置FFmpeg(可选)
    FFmpegHelper.configFFmpeg(
      log: true,
      enableArm: true,
      enableNeon: true,
      enableX86: true,
      enableX64: true,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: () async {
          // 调用FFmpeg命令
          await executeFFmpegCommand();
        },
        child: Text('Execute FFmpeg Command'),
      ),
    );
  }

  Future<void> executeFFmpegCommand() async {
    try {
      // 示例:将视频转换为MP4格式
      String inputFilePath = '/path/to/input/video.mov';
      String outputFilePath = '/path/to/output/video.mp4';
      String command = '-i $inputFilePath -c:v libx264 -c:a aac $outputFilePath';

      int result = await FFmpegHelper.execute(command);
      if (result == 0) {
        print('FFmpeg command executed successfully');
      } else {
        print('FFmpeg command failed with code: $result');
      }
    } catch (e) {
      print('Error executing FFmpeg command: $e');
    }
  }
}

2. 处理视频

在上面的示例中,executeFFmpegCommand方法执行了一个简单的FFmpeg命令,将视频从MOV格式转换为MP4格式。你需要将inputFilePathoutputFilePath替换为你自己的文件路径。

3. 处理结果

FFmpegHelper.execute方法返回一个整数结果码,0表示命令成功执行,非0表示失败。你可以根据这个结果码来处理后续逻辑。

注意事项

  1. 文件路径:确保提供的文件路径是有效的,并且你的应用有权限访问这些路径。
  2. FFmpeg命令:FFmpeg命令的格式非常灵活,你可以根据需要修改命令来完成不同的视频处理任务。
  3. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑来确保应用的健壮性。

希望这个示例能帮助你在Flutter项目中成功使用ffmpeg_helper插件进行视频处理!

回到顶部