由于“表面帧等待超时”,无法压缩视频

时间:2019-04-09 23:18:31

标签: android

我尝试使用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。我可以打开视频,但这只是音频的空白屏幕。

0 个答案:

没有答案