Flutter - 高效地将视频文件处理成内存中的一系列帧?

问题描述 投票:0回答:2

我正在尝试将视频文件转换为颤振中的一系列帧。

目前,我已经尝试过2个flutter库:

  • export_video_frame: ^0.0.6
  • video_thumbnail: ^0.4.3

但是,这两个库都花费了大量时间来处理视频文件。

  • 视频文件时长:5秒
  • 将视频文件处理成帧所需的时间:2 - 5 分钟

有没有一种方法可以更有效地处理视频文件,以限制在 Flutter 应用程序上将 5 秒的视频文件转换为一系列帧的处理时间少于 10 秒?

我尝试过的其他方法包括返回

byteArray
或文件路径的列表,与video_thumbnail类似的处理逻辑(返回所有帧而不是单个帧)。但我在实施时遇到了一些问题。

  • 为了返回
    ByteArray
    列表,应用程序在将
    Out of Memory Error
    从 Native Android 解析回 Flutter 时会抛出
    ByteArray
    。 (该应用程序不能在图像质量上妥协。因此,我无法将图像压缩为更小的尺寸。)
  • 对于返回文件路径列表,应用程序的 UI 在将帧写入手机目录时会冻结。 (该应用程序也不能在用户体验上妥协。)
flutter video-processing
2个回答
0
投票

使用 ffmpeg_kit_flutter_min_gpl :

我相信,如果您想将整个视频解耦为帧,这会提高性能效率:

videoPath :视频的路径, 使用路径提供程序获取本地目录:applicationDirectory fps :您想要的视频总帧数

        var command =
        '-i $videoPath -r $fps -f image2 ${applicationDirectory}img-%03d.png';

    await FFmpegKit.execute(command).then((session) async {
      final returnCode = await session.getReturnCode();

      await session.getAllLogsAsString();

      if (ReturnCode.isSuccess(returnCode)) {
        _logger.info('Frame Export Success');
        var paths = <String>[];

        for (var a = 1; a < fps; a++) {
          if (a < 10) {
            paths.add('${applicationDirectory}img-00$a.png');
          } else if (a < 100) {
            paths.add('${applicationDirectory}img-0$a.png');
          } else {
            paths.add('${applicationDirectory}img-$a.png');
          }
        }

0
投票

FFmpeg 是万事通,但一无是处。

如果您有时间,我建议您在 Android 上使用 mediacodec,在 iOS 上使用 AVFoundation。它们速度更快,内存和 CPU 效率更高。最重要的是,如果您使用软件限制库,FFMpeg 会增加 apk 和 ipa 的大小。

媒体编解码器:https://developer.android.com/reference/android/media/MediaCodec

AV基础: https://developer.apple.com/av-foundation/

© www.soinside.com 2019 - 2024. All rights reserved.