我正在尝试将一个视频文件转换为一系列帧。
目前,我已经尝试了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');
}
}