【问题标题】:Android FFmpegMediaMetadataRetriever.getFrameAtTime() is slowAndroid FFmpegMediaMetadataRetriever.getFrameAtTime() 很慢
【发布时间】:2015-11-10 08:34:54
【问题描述】:

我正在开发一个应用程序,它最终会以 200 毫秒的间隔将视频分割成帧。

该应用程序正常工作,您选择一个视频,该应用程序会将其切割成存储在设备上的位图。问题是,FFmpegMediaMetaRetriever.getFrameAtTime() 非常慢。我的意思是,处理视频所需的时间比视频本身长,我看到平均每帧大约 1.1 秒。

我已经跟踪到调用 getFrameAtTime 的延迟。还有其他人知道在特定时间从视频中获取帧的更好方法吗?

代码:

    new Thread(new Runnable() {
        @Override
        public void run() {
            FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever();
            retriever.setDataSource(getPath(EditVideo.this, mMediaUri));
            String time = retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION);

            // FFmpegMediaMetadataRetriever doesn't have the ability to get Width and Height of video, needed to scale down to 1024.
            MediaMetadataRetriever retriever1 = new MediaMetadataRetriever();
            retriever1.setDataSource(getPath(EditVideo.this, mMediaUri));
            int width = Integer.parseInt(retriever1.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
            int height = Integer.parseInt(retriever1.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
            retriever1.release();

            int videoDuration = Integer.parseInt(time);

            int newWidth = 1024;
            int newHeight = Math.round(height * (1024f / width));

            Bitmap bitmap;
            for(int i=0;i<videoDuration;i+=mFrameEvery){

                long startTime = System.currentTimeMillis();
                bitmap = retriever.getFrameAtTime(i*1000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);
                long endTime = System.currentTimeMillis();

                Log.d(TAG,"Took: " + ((endTime - startTime) / 1000f));

                final Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, false);

                try {
                    File frameFile = getOutputMediaFile("IMAGEFILE",rev.size());
                    FileOutputStream fos = new FileOutputStream(frameFile);
                    scaledBitmap.compress(Bitmap.CompressFormat.PNG, 80, fos);
                    fos.close();

                    rev.add(frameFile.getAbsolutePath());

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            imageView.setImageBitmap(scaledBitmap);
                            totalFrames.setText("Total Frames: " + rev.size());
                        }
                    });
                } catch (FileNotFoundException e) {
                    Log.d(TAG, "File not found: " + e.getMessage());
                } catch (IOException e) {
                    Log.d(TAG, "Error accessing file: " + e.getMessage());
                }
            }
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    progressBar.setVisibility(View.INVISIBLE);
                    seekBar.setEnabled(true);
                }
            });
        }
    }).start();

日志:

D/EditVideo: Took: 1.448
D/EditVideo: Took: 1.147
D/EditVideo: Took: 1.162
D/EditVideo: Took: 1.322
D/EditVideo: Took: 1.301
D/EditVideo: Took: 1.453
D/EditVideo: Took: 1.108
D/EditVideo: Took: 1.165
D/EditVideo: Took: 1.292
D/EditVideo: Took: 1.358
D/EditVideo: Took: 1.369
D/EditVideo: Took: 1.06
D/EditVideo: Took: 1.13
D/EditVideo: Took: 1.183
D/EditVideo: Took: 1.177
D/EditVideo: Took: 1.231
D/EditVideo: Took: 0.924
D/EditVideo: Took: 1.007
D/EditVideo: Took: 1.092
D/EditVideo: Took: 1.104
D/EditVideo: Took: 1.211
D/EditVideo: Took: 0.923
D/EditVideo: Took: 0.994
D/EditVideo: Took: 1.119
D/EditVideo: Took: 1.138
D/EditVideo: Took: 1.193

【问题讨论】:

  • 你找到答案了吗?
  • @AntonShkurenko 不幸的是不是没有。我试图通过引入多线程来“加快速度”,但 FFMpeg 似乎不是线程安全的。

标签: java android video frames


【解决方案1】:

我使用MediaMetadataRetriver,平均处理时间约为0.7秒。我还找到了一些方法来减少获取框架的时间。

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 2015-09-06
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2013-07-16
    • 2011-06-30
    • 2013-04-28
    相关资源
    最近更新 更多