android - FFmpeg 输出搜索结果到 Android LruCache

标签 android ffmpeg android-lru-cache

亲爱的 StackOverflower,

在我的 Android 应用程序中,我尝试使用 ffmpeg-android-java 从视频中快速检索帧在 ImageView 中显示。问题是使用典型的 ffmpeg-ss 搜索命令需要将输出写入内存,我认为这对性能有很大的影响:

ffmpeg -ss 00:23:00 -i Mononoke.Hime.mkv -frames:v 1 out1.jpg

像上面这样的典型命令执行大约需要 700 - 1200 毫秒。所以我不想写入内存,而是写入LruCache,希望能获得更好的性能。

问题是 ffmpeg-android-java 是执行 ffmpeg 命令的包装器,因此我不知道如何正确提供 LruCache 命令的地址。

下面是我的代码 fragment :

private void seekToPosition(long currentVideoPosition){

    String position = DiskUtils.formatMillisForFFmpeg(currentVideoPosition);

    String[] cmd = {"-ss", String.valueOf(position), "-i", mVideoPath,
                    "-y", "-an", "-frames:v", "1",
                    "/storage/emulated/0/Videos/out.jpg"}; //this the problem, I would like to change this to the address of LruCache

    try {
        // to execute "ffmpeg -version" command you just need to pass "-version"
        mFFmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {

            long start;
            long end;

            @Override
            public void onStart() {
                canSeek = false;
                start = System.currentTimeMillis();
            }

            @Override
            public void onProgress(String message) {}

            @Override
            public void onFailure(String message) {
                Log.d(TAG, "FFmpeg cmd failure");
            }

            @Override
            public void onSuccess(String message) {
                Log.d(TAG, "FFmpeg cmd success");

                /*mFFmpeg.killRunningProcesses();
                Log.d(TAG, "FFmpeg kill running process: " + mFFmpeg.killRunningProcesses());*/
            }

            @Override
            public void onFinish() {
                canSeek = true;
                Log.d(TAG, "FFmpeg cmd finished: is FFmpeg process running: " + mFFmpeg.isFFmpegCommandRunning());
                end = System.currentTimeMillis();
                Log.d(TAG, "FFmpeg excuted in: " + (end - start) + " milliseconds");
            }
        });
    } catch (FFmpegCommandAlreadyRunningException e) {
        // Handle if FFmpeg is already running
        Log.d(TAG, "FFmpeg exception: " + e);
    }
} 

最佳答案

为了回答我自己的问题,我还没有找到解决方案,因为这在本质上是不可能的。因此,我采用艰难的方式编译 FFmpeg 并使用 JNI 将其用作库。

你可以看看我的step-by-step如果您需要一些关于在 Android Studio 中构建和使用 FFmpeg 的指导,请参阅说明,因为我知道试图解决这个问题是一场真正的噩梦。

抱歉,我无法在此处发布所有说明,因为它太长了,而且对我来说,让 1 个信息来源保持最新更容易。

关于android - FFmpeg 输出搜索结果到 Android LruCache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37132546/

相关文章:

ffmpeg - x11grab设备录屏时出现黑屏

java - picasso 图像下载和缓存行为

android - 何时应该使用 LRUCache 回收位图?

android - 如何获取 ListView 上项目的Y坐标

java - Gradle 无法使用 libs 进行编译

ffmpeg如何同时录制和预览

android - 使用 LruCache 在内存中存储位图

java - 动态克隆 android Activity ?

android - 创建带有阴影的矢量可绘制对象以覆盖图像

c++ - FFmpeg C++ api 解码 h264 错误