【问题标题】:FFmpeg - cannot find ExecuteBinaryResponseHandler - Android/JavaFFmpeg - 找不到 ExecuteBinaryResponseHandler - Android/Java
【发布时间】:2018-01-14 22:11:23
【问题描述】:

我正在尝试为 react-native 制作一个模块,它将视频更改为 gif。我对 android studios/java 几乎没有经验,但我很想了解更多!我正在使用this library 将视频转换为 gif。这是我的代码:

package com.reactlibrary;

import android.widget.Toast;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.github.hiteshsondhi88.libffmpeg.FFmpeg;

public class RNGifMakerModule extends ReactContextBaseJavaModule {

  private final ReactApplicationContext reactContext;

  public RNGifMakerModule(ReactApplicationContext reactContext) {
    super(reactContext);
    this.reactContext = reactContext;
  }

  @Override
  public String getName() {
    return "RNGifMakerModule";
  }

  @ReactMethod
  public void alert(String message) {
      Toast.makeText(getReactApplicationContext(), "Error", Toast.LENGTH_LONG).show();
      String[] cmd = {"-i"
              , message
              , "Image.gif"};
      conversion(cmd);
  }

  public void conversion(String[] cmd) {

    FFmpeg ffmpeg = FFmpeg.getInstance(this.reactContext);

    try {


      // to execute "ffmpeg -version" command you just need to pass "-version"
      ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {

        @Override
        public void onStart() {
        }

        @Override
        public void onProgress(String message) {
        }

        @Override
        public void onFailure(String message) {
        }

        @Override
        public void onSuccess(String message) {
        }

        @Override
        public void onFinish() {
        }
      });
    } catch (FFmpegCommandAlreadyRunningException e) {
      // Handle if FFmpeg is already running
      e.printStackTrace();
    }
  }
}

我得到这个错误:

Error:(43, 31) error: cannot find symbol class ExecuteBinaryResponseHandler

这似乎很奇怪,因为在the documentation for ffmpeg-android-java 中它说使用几乎完全相同的代码。

赏金

如果您能找到将 video.mp4 转换为 gif 的方法,您将获得赏金。您不一定必须使用FFmpeg,但您的解决方案必须适用于 java/android 工作室。

【问题讨论】:

  • 你导入那个ExecuteBinaryResponseHandler了吗?
  • 嗯...不,我认为这将包含在 ...libffmpeg.FFmpeg
  • 你能发布你的整个班级和整个错误信息吗?
  • 当然可以。我会在大约一个小时内上班。
  • 我猜你应该单独导入那个类。 import com.github.hiteshsondhi88.libffmpeg.ExecuteBinaryResponseHandler

标签: java android ffmpeg


【解决方案1】:

首先你应该正确初始化ffmpeg。

FFmpeg ffmpeg = FFmpeg.getInstance(this.reactContext);

// please add following method after

ffmpeg.loadBinary(new FFmpegLoadBinaryResponseHandler() {
            @Override
            public void onFailure() {
                // probably your device not supported
            }

            @Override
            public void onSuccess() {
                // you should init flag here (isLoaded, isReady etc.)
            }

只有在onSuccess() 之后才能使用命令。

那么请关注 LordNeckbeard 的 answer。

所以你的代码应该是这样的:

if (isFFmpegLoaded) {
    // ffmpeg.execute(commands from link from the answer) 
}

请不要忘记删除命令字符串和“ffmpeg”单词中的所有空格。 为了使命令更具可读性,我建议构建这样的命令:

final String[] command = new String[11]; // example of the first command in the answer
        command[0] = "-y";
        command[1] = "-ss";
        command[2] = "30";
        command[3] = "-t";
        command[4] = "3";
        command[5] = "-i";
        command[6] = "-t";
        command[7] = "filePath";
        command[8] = "-vf"; 
        command[9] = "fps=10,scale=320:-1:flags=lanczos,palettegen";
        command[10] = "palette.png"; 

请确保您拥有使用文件的存储权限,以防万一您使用外部存储。

基于此策略,ffmpeg 对我来说效果很好。谢谢,祝你好运!

【讨论】:

  • 非常感谢您的回答!但是,当我尝试您提供的代码时出现此错误:Error:(48, 27) error: cannot find symbol class FFmpegLoadBinaryResponseHandler
【解决方案2】:

首先,您应该使用:File - Invalidate Caches/Restart - Invalidate and Restart 并尝试重新导入ExecuteBinaryResponseHan‌dler。如果问题尚未解决,您可以尝试小技巧。在您的项目中创建包com.github.hiteshsondhi88.libffmpeg 和类:

public class ExecuteBinaryResponseHandler implements FFmpegExecuteResponseHandler {

    @Override
    public void onSuccess(String message) {

    }

    @Override
    public void onProgress(String message) {

    }

    @Override
    public void onFailure(String message) {

    }

    @Override
    public void onStart() {

    }

    @Override
    public void onFinish() {

    }
}

应该和图片一样:

然后在 defaultConfig 块中的 build.gradle 文件中添加 multiDexEnabled true

然后你就可以使用那个类了

【讨论】:

  • 感谢您的回答!我做了第一部分,但在完成第二部分之前,我意识到我认为我没有正确导入它(实际上我没有导入任何东西)。导入库应该怎么做?
  • 你能给我一个 github 链接到你项目的工作版本吗?
  • 我现在正在查看存储库。非常感谢你做到了!我收到此错误“Error:(1, 0) Minimum supported Gradle version is 3.3. Current version is 2.14.1. If using the gradle wrapper, try editing the distributionUrl in /Users/zoe/Developer/tmp/FFmpegSample/gradle/wrapper/gradle-wrapper.properties to gradle-3.3-all.zip <a href="openFile:/Users/zoe/Developer/tmp/FFmpegSample/app/build.gradle">Open File</a> 任何想法,如果不是那也没关系。再次感谢您!
  • 尝试使用 Gradle 包装器。 File - Settings - Build, Execution, Dep.. - Gradle 并选择“使用默认 gradle wrapper (recommended)”。另外,禁用即时运行:文件 - 设置 - 构建、执行、部署.. - 即时运行并取消标记“启用即时运行以热交换...”
  • 我这样做了,它有点工作,但我得到了这个错误(下面的链接)。由于您给予我的所有帮助,我真的很想奖励您。当我构建我的应用程序时,让我知道您对此错误的看法:imgur.com/a/0NL0C 再次感谢您的帮助。项目截图:imgur.com/a/2TN3x
猜你喜欢
  • 2022-11-27
  • 1970-01-01
  • 2021-02-13
  • 2022-08-23
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多