ffmpeg 套件 flutter 视频压缩器
ffmpeg kit flutter video compressor
我对 ffmpeg 没有经验。所以如果我在错误的地方问错了问题,我很抱歉。
我正在尝试制作一个视频压缩器,我添加的依赖完全一样:ffmpeg_kit_flutter_full_gpl: ^4.5.1
我写的代码是这样的:
compress(path) {
FFmpegKit.executeAsync("-i $path -c:a copy -c:v libx264 -s 848x360 output.mp4", (session) async {
final returnCode = await session.getReturnCode();
if (ReturnCode.isSuccess(returnCode)){
print("işlem başarılı");
// SUCCESS
} else if (ReturnCode.isCancel(returnCode)) {
print("iptal edildi");
// CANCEL
} else {
print("hata oluştu");
print(await session.getFailStackTrace());
// ERROR
}
});
}
并且我像这样调用此方法:
asset.originFile.then((fle) {
var path = fle!.path;
compress(path);
}
);
由于某种原因,它总是 returns 错误情况。 session.getFailStackTrace()
为空。
我的第一个问题是你认为这里有什么问题?
其次,在这种情况下我如何检测错误是什么?
提前致谢:)
最后,在@kesh 的建议下,我使用了这段代码来查看错误;
FFmpegKitConfig.enableLogCallback((log) {
final message = log.getMessage();
print(message);
});
而且我发现,如果您的视频名称包含 space 或特殊字符,FFmpeg 工具包会出错。所以,我为输入文件和输出文件生成随机名称并重命名它们..
如果有人需要 ffmpeg 视频压缩器,我将留下代码:
我对 pubspec.yaml 的依赖;
ffmpeg_kit_flutter_full_gpl: ^4.5.1
我正在生成新名称,例如:
asset.originFile.then((fle) {
const _chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
Random _rnd = Random();
String getRandomString(int length) => String.fromCharCodes(Iterable.generate(
length, (_) => _chars.codeUnitAt(_rnd.nextInt(_chars.length))));
String newName = getRandomString(15);
String newInput = getRandomString(16);
var outputPath = fle!.path.toString().split('/');
outputPath.remove(outputPath[(outputPath.length)-1]);
var out = outputPath.join('/');
String output = out + "/" + newName + ".mp4";
String inputPath = out + "/" + newInput + ".mp4";
fle.rename(inputPath);
compress(inputPath, output);
}
我的压缩函数是:
compress(path, output) {
FFmpegKit.executeAsync("-y -i $path -vcodec libx264 -crf 22 $output", (Session session) async {
final returnCode = await session.getReturnCode();
if (ReturnCode.isSuccess(returnCode)){
print("işlem başarılı");
File lastVid = File(output);
//SUCCESS
} else if (ReturnCode.isCancel(returnCode)) {
print("iptal edildi");
// CANCEL
} else {
print("hata oluştu");
FFmpegKitConfig.enableLogCallback((log) {
final message = log.getMessage();
print(message);
});
// ERROR
}
});
}
我对 ffmpeg 没有经验。所以如果我在错误的地方问错了问题,我很抱歉。
我正在尝试制作一个视频压缩器,我添加的依赖完全一样:ffmpeg_kit_flutter_full_gpl: ^4.5.1
我写的代码是这样的:
compress(path) {
FFmpegKit.executeAsync("-i $path -c:a copy -c:v libx264 -s 848x360 output.mp4", (session) async {
final returnCode = await session.getReturnCode();
if (ReturnCode.isSuccess(returnCode)){
print("işlem başarılı");
// SUCCESS
} else if (ReturnCode.isCancel(returnCode)) {
print("iptal edildi");
// CANCEL
} else {
print("hata oluştu");
print(await session.getFailStackTrace());
// ERROR
}
});
}
并且我像这样调用此方法:
asset.originFile.then((fle) {
var path = fle!.path;
compress(path);
}
);
由于某种原因,它总是 returns 错误情况。 session.getFailStackTrace()
为空。
我的第一个问题是你认为这里有什么问题?
其次,在这种情况下我如何检测错误是什么?
提前致谢:)
最后,在@kesh 的建议下,我使用了这段代码来查看错误;
FFmpegKitConfig.enableLogCallback((log) {
final message = log.getMessage();
print(message);
});
而且我发现,如果您的视频名称包含 space 或特殊字符,FFmpeg 工具包会出错。所以,我为输入文件和输出文件生成随机名称并重命名它们..
如果有人需要 ffmpeg 视频压缩器,我将留下代码:
我对 pubspec.yaml 的依赖;
ffmpeg_kit_flutter_full_gpl: ^4.5.1
我正在生成新名称,例如:
asset.originFile.then((fle) {
const _chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
Random _rnd = Random();
String getRandomString(int length) => String.fromCharCodes(Iterable.generate(
length, (_) => _chars.codeUnitAt(_rnd.nextInt(_chars.length))));
String newName = getRandomString(15);
String newInput = getRandomString(16);
var outputPath = fle!.path.toString().split('/');
outputPath.remove(outputPath[(outputPath.length)-1]);
var out = outputPath.join('/');
String output = out + "/" + newName + ".mp4";
String inputPath = out + "/" + newInput + ".mp4";
fle.rename(inputPath);
compress(inputPath, output);
}
我的压缩函数是:
compress(path, output) {
FFmpegKit.executeAsync("-y -i $path -vcodec libx264 -crf 22 $output", (Session session) async {
final returnCode = await session.getReturnCode();
if (ReturnCode.isSuccess(returnCode)){
print("işlem başarılı");
File lastVid = File(output);
//SUCCESS
} else if (ReturnCode.isCancel(returnCode)) {
print("iptal edildi");
// CANCEL
} else {
print("hata oluştu");
FFmpegKitConfig.enableLogCallback((log) {
final message = log.getMessage();
print(message);
});
// ERROR
}
});
}