我正在尝试将视频文件转换为颤振中的一系列帧。
目前,我已经尝试过2个flutter库:
export_video_frame: ^0.0.6
video_thumbnail: ^0.4.3
但是,这两个库都花费了大量时间来处理视频文件。
有没有一种方法可以更有效地处理视频文件,以限制在 Flutter 应用程序上将 5 秒的视频文件转换为一系列帧的处理时间少于 10 秒?
我尝试过的其他方法包括返回
byteArray
或文件路径的列表,与video_thumbnail类似的处理逻辑(返回所有帧而不是单个帧)。但我在实施时遇到了一些问题。
ByteArray
列表,应用程序在将 Out of Memory Error
从 Native Android 解析回 Flutter 时会抛出 ByteArray
。 (该应用程序不能在图像质量上妥协。因此,我无法将图像压缩为更小的尺寸。)使用 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');
}
}
FFmpeg 是万事通,但一无是处。
如果您有时间,我建议您在 Android 上使用 mediacodec,在 iOS 上使用 AVFoundation。它们速度更快,内存和 CPU 效率更高。最重要的是,如果您使用软件限制库,FFMpeg 会增加 apk 和 ipa 的大小。
媒体编解码器:https://developer.android.com/reference/android/media/MediaCodec