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

                                          }
                                   });
                                }