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



我正在尝试将一个视频文件转换为一系列帧。

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

  • export_video_frame: ^0.0.6
  • video_thumbnail: ^0.4.3

但是,这两个库都要花费相当多的时间来处理视频文件。

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

有办法处理视频文件更有效地限制5秒钟视频文件转换成一系列的帧在不到10年代处理时间对颤振的应用?

我尝试过的其他方法包括返回byteArray或文件路径列表,类似于video_thumbnail的处理逻辑(返回所有帧而不是单个帧)。但是我在实施的过程中遇到了一些问题。

  • 对于返回ByteArray列表,应用程序在解析ByteArray从原生Android返回到Flutter时抛出Out of Memory Error。(这款应用不能在图像质量上妥协。因此,我无法将图像压缩成更小的大小。
  • filepath返回一个列表,写作时应用程序的UI冻结帧到电话目录中。(应用程序也不能在用户体验上妥协)

使用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');
}
}

最新更新