3

親愛なる StackOverflower 様

私のAndroidアプリケーションでは、ffmpeg-android-javaを使用してビデオからフレームをすばやく取得してImageView. 問題は、典型的なffmpeg's -ssseek コマンドを使用すると、出力をメモリに書き込む必要があることです。これは、パフォーマンスに大きな影響を与えると思います。

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

上記のような一般的なコマンドの実行には、約 700 ~ 1200 ミリ秒かかります。LruCacheですから、メモリに書き込むのではなく、より良いパフォーマンスを達成することを願って書き込みたいと思います。

問題は、コマンドffmpeg-android-javaを実行するためのラッパーであるため、コマンドのアドレスffmpegを正しく指定する方法がわかりません。LruCache

以下は私のコードスニペットです:

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);
    }
} 
4

1 に答える 1