android - 为什么 FFMPEG 命令在棉花糖和 Lollipop 中不起作用?

标签 android ffmpeg

为什么我的代码不能在棉花糖和 Lollipop 设备上运行。或者知道如何在该版本中使用 FFMPEG。任何帮助。

import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.kru.ffmpeglibs.FFmpeg;
import com.kru.ffmpeglibs.FFmpegExecuteResponseHandler;
import com.kru.ffmpeglibs.FFmpegLoadBinaryResponseHandler;
import com.kru.ffmpeglibs.exceptions.FFmpegCommandAlreadyRunningException;
import com.kru.ffmpeglibs.exceptions.FFmpegNotSupportedException;

public class CommandsActivity extends AppCompatActivity {
private FFmpeg fFmpeg;
private Button btnGenerate;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    fFmpeg = FFmpeg.getInstance(CommandsActivity.this);
    executeBinary();

    btnGenerate = (Button) findViewById(R.id.btnGenerate);
    btnGenerate.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                String[] ffmpegCommand = { "-i "
                        + Environment.getExternalStorageDirectory()
                                .getPath()
                        + "/vid.mp4"
                        + " -r 10 "
                        + Environment.getExternalStorageDirectory()
                                .getPath()
                        + "/com.mobvcasting.mjpegffmpeg/frame_%05d.jpg" };

                executeCommand(ffmpegCommand);

            } catch (FFmpegCommandAlreadyRunningException e) {
                e.printStackTrace();
            }
        }
    });
}

private void executeCommand(String[] cmd)
        throws FFmpegCommandAlreadyRunningException {

    fFmpeg.execute(cmd, new FFmpegExecuteResponseHandler() {
        @Override
        public void onSuccess(String message) {

            Toast.makeText(CommandsActivity.this, "Sucesses..",
                    Toast.LENGTH_SHORT).show();

            System.out.println(message);
        }

        @Override
        public void onProgress(String message) {
            // Toast.makeText(MainActivity.this, "On Process",
            // Toast.LENGTH_SHORT).show();
            System.out.println(message);
        }

        @Override
        public void onFailure(String message) {
            Toast.makeText(CommandsActivity.this, "Fail this",
                    Toast.LENGTH_SHORT).show();
            System.out.println(message);
        }

        @Override
        public void onStart() {

        }

        @Override
        public void onFinish() {
            Toast.makeText(CommandsActivity.this, "Finish",
                    Toast.LENGTH_SHORT).show();

        }
    });
}

private void executeBinary() {

    try {
        fFmpeg.loadBinary(new FFmpegLoadBinaryResponseHandler() {
            @Override
            public void onFailure() {

            }

            @Override
            public void onSuccess() {

            }

            @Override
            public void onStart() {

            }
            @Override
            public void onFinish() {

            }
        }); } catch (FFmpegNotSupportedException e) {   e.printStackTrace();
    }
  }
}

这是我的代码,但仍然无法正常工作。请告诉我代码有什么问题 我得到的异常是这样的。

02-22 11:18:41.469: E/AndroidRuntime(27839): FATAL EXCEPTION: main
02-22 11:18:41.469: E/AndroidRuntime(27839):     java.lang.UnsatisfiedLinkError: Native method not found: com.kru.ffmpeglibs.ArmArchHelper.cpuArchFromJNI:()Ljava/lang/String;
02-22 11:18:41.469: E/AndroidRuntime(27839):    at com.kru.ffmpeglibs.ArmArchHelper.cpuArchFromJNI(Native Method)
02-22 11:18:41.469: E/AndroidRuntime(27839):    at com.kru.ffmpeglibs.CpuArchHelper.getCpuArch(CpuArchHelper.java:61)
02-22 11:18:41.469: E/AndroidRuntime(27839):    at com.kru.ffmpeglibs.FFmpeg.loadBinary(FFmpeg.java:40)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at com.kru.sampleffmpeg.MainActivity.loadFFMpegBinary(MainActivity.java:68)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at com.kru.sampleffmpeg.MainActivity.onCreate(MainActivity.java:36)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at android.app.Activity.performCreate(Activity.java:5372)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at android.app.ActivityThread.access$700(ActivityThread.java:159)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at android.os.Handler.dispatchMessage(Handler.java:99)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at android.os.Looper.loop(Looper.java:176)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at android.app.ActivityThread.main(ActivityThread.java:5419)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at java.lang.reflect.Method.invokeNative(Native Method)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at java.lang.reflect.Method.invoke(Method.java:525)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
 02-22 11:18:41.469: E/AndroidRuntime(27839):   at dalvik.system.NativeStart.main(Native Method)

最佳答案

让我们以其他方式查看 FFmpeg 设置,只需将 compile 'com.github.hiteshsondhi88.libffmpeg:FFmpegAndroid:0.2.5' 放入 gradle 即可。现在按照步骤使用 this链接,现在你必须在使用执行命令之前调用

MainActivity.java

public class MainActivity extends AppCompatActivity {

EditText editText;
Button click;
FFmpeg fFmpeg;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    fFmpeg = FFmpeg.getInstance(MainActivity.this);
    executeBinary();

    click = (Button) findViewById(R.id.btnChk);
    editText=(EditText)findViewById(R.id.editText);
    Log.e("Log",Environment.getExternalStorageDirectory().getAbsolutePath().toString());

    click.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            try {
                String cmd=editText.getText().toString();

               // frameCount.mp4

                executeCommand(cmd);
            } catch (FFmpegCommandAlreadyRunningException e) {
                e.printStackTrace();
            }

        }
    });


}

private void executeCommand(String cmd) throws FFmpegCommandAlreadyRunningException {

    fFmpeg.execute(cmd, new FFmpegExecuteResponseHandler() {
        @Override
        public void onSuccess(String message) {

            Toast.makeText(MainActivity.this, "Sucesses..", Toast.LENGTH_SHORT).show();

            System.out.println(message);
        }

        @Override
        public void onProgress(String message) {
          //  Toast.makeText(MainActivity.this, "On Process", Toast.LENGTH_SHORT).show();
            System.out.println(message);
        }

        @Override
        public void onFailure(String message) {
            Toast.makeText(MainActivity.this, "Fail this", Toast.LENGTH_SHORT).show();
            System.out.println(message);
        }

        @Override
        public void onStart() {

        }

        @Override
        public void onFinish() {
            Toast.makeText(MainActivity.this, "Finish", Toast.LENGTH_SHORT).show();

        }
    });

}

private void executeBinary() {

    try {
        fFmpeg.loadBinary(new FFmpegLoadBinaryResponseHandler() {
            @Override
            public void onFailure() {

            }

            @Override
            public void onSuccess() {

            }

            @Override
            public void onStart() {

            }

            @Override
            public void onFinish() {

            }
        });
    } catch (FFmpegNotSupportedException e) {
        e.printStackTrace();
    }
  }
}

请参见下图,在 EditText 中使用您的命令作为输入 -i/storage/emulated/0/frameCount.mp4 -r 7/storage/emulated/0/frame%03d.jpg

Images

关于android - 为什么 FFMPEG 命令在棉花糖和 Lollipop 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35499177/

相关文章:

android - 带有 XML 的可绘制中心裁剪

ffmpeg - 尝试使用 NVDEC 解码 4K 视频时出错

c++ - 如何强制使用 ffmpeg 的特定编解码器?

ffmpeg make ERROR : avisynth/avisynth_c. h avisynth/avs/version.h not found

android - 如何从通知中删除 "+999"?

java - Android Espresso UI 测试 - 测试运行失败 : Instrumentation run failed due to 'java.lang.IllegalAccessError'

android - 当我在文本框中键入一些文本时,OnKey 事件分派(dispatch)了两次。如何预防?

java - Android:将按钮添加到 YouTubePlayerView

c++ - 仅 Debug模式下的 FFMPEG 异常

java - FFmpeg 日志记录在 java 命令运行中不起作用