FFmpeg 输出搜索结果到 Android LruCache
FFmpeg output seeking result to Android LruCache
亲爱的 Whosebuger,
在我的 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
命令的地址。
下面是我的代码片段:
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 将其用作库的困难方法。
如果您需要一些关于通过 Android Studio 构建和使用 FFmpeg 的指导,您可以查看我的 step-by-step 说明,因为我知道试图解决这个问题是一场真正的噩梦。
抱歉我不能post这里的所有说明,因为它太长了,而且我更容易保持 1 个信息源是最新的。
亲爱的 Whosebuger,
在我的 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
命令的地址。
下面是我的代码片段:
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 将其用作库的困难方法。
如果您需要一些关于通过 Android Studio 构建和使用 FFmpeg 的指导,您可以查看我的 step-by-step 说明,因为我知道试图解决这个问题是一场真正的噩梦。
抱歉我不能post这里的所有说明,因为它太长了,而且我更容易保持 1 个信息源是最新的。