我正在使用Android Studio 4.01版中的FFmpeg库开发一个Android视频编辑应用程序。当我尝试调试时,调试器会进入反编译器并闪烁,显示“源代码与字节码不匹配”跨越了整个反编译代码。调试器似乎也半随机地在反编译后的代码中跳跃,例如:here,其中logSlowDispatch为false,但是调试器无论如何都进入if语句的内容而不进行检查并闪烁'源代码不匹配字节码”。我看过很多有关此问题的文章,并尝试了许多建议的解决方案,从使缓存无效/重新启动到重新安装Android Studio都无济于事。我已经读到冗余或过时的gradle依赖关系可能与此有关,但是删除其中一些依赖关系并没有帮助:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
defaultConfig {
applicationId "com.example.capstoneapplication"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndkVersion "21.3.6528147"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support.constraint:constraint-layout:2.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.writingminds:FFmpegAndroid:0.3.2'
implementation 'org.florescu.android.rangeseekbar:rangeseekbar-library:0.3.0'
implementation 'com.intuit.sdp:sdp-android:1.0.6'
}
我的代码似乎可以正常运行,并且在两次跳转到反编译器之间的所需视频上执行ffmpeg命令,但视频无法保存。这是可能导致此问题的java类的摘录:
@Override
public boolean onOptionsItemSelected(MenuItem menuItem){
if(menuItem.getItemId()==R.id.trim){
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(com.example.capstoneapplication.VideoTrimmer.this);
LinearLayout linLay = new LinearLayout(com.example.capstoneapplication.VideoTrimmer.this);
linLay.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams layPar = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layPar.setMargins(50, 0, 50, 100 );
final EditText input = new EditText(com.example.capstoneapplication.VideoTrimmer.this);
input.setLayoutParams(layPar);
input.setGravity(Gravity.TOP|Gravity.START);
input.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
linLay.addView(input,layPar);
alertDialog.setMessage("Enter Video Name");
alertDialog.setTitle("Change Video Name");
alertDialog.setView(linLay);
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.setPositiveButton("Submit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
fileName = input.getText().toString();
try {
snipVideo(videoDurBar.getAbsoluteMinValue().intValue(), videoDurBar.getSelectedMaxValue().intValue(), fileName);
} catch ( FFmpegNotSupportedException e) {
e.printStackTrace();
}
}
});
alertDialog.show();
}
return super.onOptionsItemSelected(menuItem);
}
private void snipVideo( int min, int max, String fileName) throws FFmpegNotSupportedException {
File destFolder = new File("storage/emulated/0" + "/EditingApeSnippedVideos");
if(!destFolder.exists()){
destFolder.mkdir();
}
String fileExtension = ".mp4";
destination = new File(destFolder, fileName + fileExtension);
inputVideoPath = getPathFromUri(getApplicationContext(),uri);
command = new String[]{"-ss", "" + min/1000 , "-y", "-i", inputVideoPath, "-t", ""+ (max-min)/1000 ,"-vcodec", "mpeg4", "-b:v","2097152","-b:a", "48000", "-ac","2","-ar","22050", destination.getAbsolutePath()};
//testing command
//command = new String []{"-y", "-i", inputVideoPath, "-ss", "00:00:02" , "-to", "00:00:03", "-c", "copy", destination.getAbsolutePath()};
final FFmpeg ff = FFmpeg.getInstance(this);
ff.loadBinary(new FFmpegLoadBinaryResponseHandler() {
@Override
public void onStart() {
Log.i("VideoTrimmer","onStart");
}
@Override
public void onFinish() {
Log.i("VideoTrimmer","onFinish");
}
@Override
public void onFailure() {
Log.i("VideoTrimmer","onFailure");
}
@Override
public void onSuccess() {
Log.i("VideoTrimmer","Success");
try {
ff.execute(command, new ExecuteBinaryResponseHandler());
} catch (FFmpegCommandAlreadyRunningException e) {
Log.i("VideoTrimmer","FFmpegAlreadyRunning Exception");
}
}
});
}
有人找到解决此调试器问题的方法吗?
答案 0 :(得分:0)
我不熟悉Android,但是在IntelliJ中也可以看到这种行为。调试器以某种方式指向旧的编译文件,而不是新的文件。
对于Java,您始终可以删除目标文件夹并重新构建。查看是否在某处(目标文件夹)有任何类似的已编译文件,可以将其删除并重新构建。
完成后,点击文件->使缓存无效/重新启动