我尝试使用Silicompressor和VideoCompressor,而且两者似乎都使用一些类似的代码。每当我尝试使用其中任何一个来压缩视频时,应用程序都会冻结,并且会出现很多错误,例如
E/tmessages: Surface frame wait timed out
E/tmessages: Surface frame wait timed out
E/tmessages: Surface frame wait timed out
E/tmessages: Surface frame wait timed out
我尝试将目标路径指向不同的地方
我尝试使用异步任务
我已经尝试在我的Proguard中分配“ -dontoptimize”
这是我正在使用的一些代码的示例
VideoCompressAsyncTask videoAsyncTask = new VideoCompressAsyncTask();
try {
Object result = videoAsyncTask.execute().get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
...
private class VideoCompressAsyncTask extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... paths) {
File tempFile = new File(fileDir.toString()+"/temp");
tempFile.mkdir();
try {
compressedFilePath = SiliCompressor.with(mContext).compressVideo(filePath, tempFile.toString());
} catch (URISyntaxException e) {
e.printStackTrace();
}
compressedFile = new File(compressedFilePath);
return compressedFilePath;
}
@Override
protected void onPostExecute(String compressedFilePath) {
super.onPostExecute(compressedFilePath);
String fileSize = Utils.longToSize(file.length());
String compressedFileSize = Utils.longToSize(compressedFile.length());
Log.d(TAG, "File path: "+filePath);
Log.d(TAG, "File size: "+fileSize);
Log.d(TAG, "Compressed Filepath: "+compressedFilePath);
Log.d(TAG, "Compressed File size: "+compressedFileSize);
}
}
问题似乎发生在OutputSurface.java中:
synchronized (mFrameSyncObject) {
while (!mFrameAvailable) {
try {
mFrameSyncObject.wait(TIMEOUT_MS);
if (!mFrameAvailable) {
throw new RuntimeException("Surface frame wait timed out");
}
} catch (InterruptedException ie) {
throw new RuntimeException(ie);
}
}
mFrameAvailable = false;
}
最终发生的事情是该过程确实完成了,但是文件太小了。我将从8MB扩展到40KB。我可以打开视频,但这只是音频的空白屏幕。