我使用javacv制作了一个录像机android应用。 但是,当我运行此应用程序时,会发生此错误“ java.lang.NoClassDefFoundError:org.bytedeco.javacpp.avutil”。
如何解决此错误?
gradle.build文件
android {
..............
packagingOptions {
exclude 'Meta-INF/services/javax.annotation.processing.Processor'
pickFirst 'Meta-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties'
pickFirst 'Meta-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml'
pickFirst 'Meta-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties'
pickFirst 'Meta-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml'
}
}
dependencies {
implementation group: 'org.bytedeco',name: 'javacv',version: '1.1'
implementation group: 'org.bytedeco.javacpp-presets',name: 'opencv',version: '3.0.0-1.1',classifier: 'android-arm'
implementation group: 'org.bytedeco.javacpp-presets',name: 'ffmpeg',version: '2.8.1-1.1',classifier: 'android-x86'
implementation group: 'org.bytedeco.javacpp-presets',classifier: 'android-x86'
}
我的演示代码 VideoService ,它将在Mainactivity中调用
package com.fs.fs.api;
import com.fs.fs.App;
import com.fs.fs.utils.DateUtils;
import com.fs.fs.utils.FileUtils;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.FrameRecorder;
import java.util.Date;
/**
* Created by wyx on 2017/1/11.
*/
public class VideoService {
private FFmpegFrameRecorder mFrameRecorder;
private String path;
private VideoService() {
}
private static class SingletonHolder {
private static final VideoService INSTANCE = new VideoService();
}
public static VideoService getInstance() {
return SingletonHolder.INSTANCE;
}
public void startRecordVideo() {
String fileName = String.format("%s.%s",DateUtils.date2String(new Date(),"yyyyMMdd_HHmmss"),"mp4");
path = FileUtils.getExternalFullPath(App.getInstance(),fileName);
mFrameRecorder = new FFmpegFrameRecorder(path,640,480,1);
mFrameRecorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
mFrameRecorder.setVideoOption("tune","zerolatency");
mFrameRecorder.setVideoOption("preset","ultrafast");
mFrameRecorder.setVideoOption("crf","28");
mFrameRecorder.setVideoBitrate(300 * 1000);
mFrameRecorder.setformat("mp4");
mFrameRecorder.setframeRate(30);
mFrameRecorder.setaudioOption("crf","0");
mFrameRecorder.setSampleRate(48 * 1000);
mFrameRecorder.setaudioBitrate(960 * 1000);
mFrameRecorder.setaudioCodec(avcodec.AV_CODEC_ID_AAC);
try {
mFrameRecorder.start();
} catch (FrameRecorder.Exception e) {
e.printStackTrace();
}
}
public void stop() {
if (mFrameRecorder != null) {
try {
mFrameRecorder.stop();
mFrameRecorder.release();
} catch (FrameRecorder.Exception e) {
e.printStackTrace();
}
mFrameRecorder = null;
}
}
}
Mainactivity
package com.fs.fs.activity;
import android.app.activity;
import android.os.Bundle;
import com.fs.fs.R;
import com.fs.fs.api.VideoService;
import static java.lang.Thread.sleep;
public class Mainactivity extends activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
VideoService.getInstance().startRecordVideo();
try {
sleep(10 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
VideoService.getInstance().stop();
}
}
错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.usb,PID: 660
java.lang.NoClassDefFoundError: org.bytedeco.javacpp.avutil
at org.bytedeco.javacpp.Loader.load(Loader.java:590)
at org.bytedeco.javacpp.Loader.load(Loader.java:530)
at org.bytedeco.javacpp.avcodec$AVPacket.<clinit>(avcodec.java:1694)
at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:149)
at com.fs.fs.api.VideoService.startRecordVideo(VideoService.java:34)
at com.fs.fs.activity.Mainactivity.onCreate(Mainactivity.java:75)
at android.app.activity.performCreate(activity.java:5304)
at android.app.Instrumentation.callactivityOnCreate(Instrumentation.java:1090)
at android.app.activityThread.performLaunchactivity(activityThread.java:2245)
at android.app.activityThread.handleLaunchactivity(activityThread.java:2331)
at android.app.activityThread.access$1000(activityThread.java:143)
at android.app.activityThread$H.handleMessage(activityThread.java:1244)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.activityThread.main(activityThread.java:5291)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassnotFoundException: org.bytedeco.javacpp.avutil
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at org.bytedeco.javacpp.Loader.load(Loader.java:585)
at org.bytedeco.javacpp.Loader.load(Loader.java:530)
at org.bytedeco.javacpp.avcodec$AVPacket.<clinit>(avcodec.java:1694)
at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:149)
at com.fs.fs.api.VideoService.startRecordVideo(VideoService.java:34)
at com.fs.fs.activity.Mainactivity.onCreate(Mainactivity.java:75)
at android.app.activity.performCreate(activity.java:5304)
at android.app.Instrumentation.callactivityOnCreate(Instrumentation.java:1090)
at android.app.activityThread.performLaunchactivity(activityThread.java:2245)
at android.app.activityThread.handleLaunchactivity(activityThread.java:2331)
at android.app.activityThread.access$1000(activityThread.java:143)
at android.app.activityThread$H.handleMessage(activityThread.java:1244)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.activityThread.main(activityThread.java:5291)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoClassDefFoundError: org/bytedeco/javacpp/avutil
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at org.bytedeco.javacpp.Loader.load(Loader.java:585)
at org.bytedeco.javacpp.Loader.load(Loader.java:530)
at org.bytedeco.javacpp.avcodec$AVPacket.<clinit>(avcodec.java:1694)
at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:149)
at com.fs.fs.api.VideoService.startRecordVideo(VideoService.java:34)
at com.fs.fs.activity.Mainactivity.onCreate(Mainactivity.java:75)
at android.app.activity.performCreate(activity.java:5304)
at android.app.Instrumentation.callactivityOnCreate(Instrumentation.java:1090)
at android.app.activityThread.performLaunchactivity(activityThread.java:2245)
at android.app.activityThread.handleLaunchactivity(activityThread.java:2331)
at android.app.activityThread.access$1000(activityThread.java:143)
at android.app.activityThread$H.handleMessage(activityThread.java:1244)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.activityThread.main(activityThread.java:5291)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassnotFoundException: Didn't find class "org.bytedeco.javacpp.avutil" on path: DexPathList[[zip file "/data/app/com.fs.fs-2.apk"],nativelibraryDirectories=[/data/app-lib/com.fs.fs-2,/vendor/lib,/system/lib,/data/datalib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at org.bytedeco.javacpp.Loader.load(Loader.java:585)
at org.bytedeco.javacpp.Loader.load(Loader.java:530)
at org.bytedeco.javacpp.avcodec$AVPacket.<clinit>(avcodec.java:1694)
at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:149)
at com.fs.fs.api.VideoService.startRecordVideo(VideoService.java:34)
at com.fs.fs.activity.Mainactivity.onCreate(Mainactivity.java:75)
at android.app.activity.performCreate(activity.java:5304)
at android.app.Instrumentation.callactivityOnCreate(Instrumentation.java:1090)
at android.app.activityThread.performLaunchactivity(activityThread.java:2245)
at android.app.activityThread.handleLaunchactivity(activityThread.java:2331)
at android.app.activityThread.access$1000(activityThread.java:143)
at android.app.activityThread$H.handleMessage(activityThread.java:1244)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.activityThread.main(activityThread.java:5291)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
at dalvik.system.NativeStart.main(Native Method)
我该如何解决此错误?
为什么会发生错误?