gpt4 book ai didi

android - 在 android 上以 30fps 显示来自 SDCard 的 450 个图像文件

转载 作者:行者123 更新时间:2023-11-29 21:23:16 24 4
gpt4 key购买 nike

我正在尝试开发一个应用程序,该应用程序拍摄 15 秒的视频,允许用户应用不同的滤镜,显示效果预览,然后允许将处理后的视频保存到 sdcard。我使用 ffmpeg 将视频拆分为 JPEG 帧,使用 GPUImage 对所有帧应用所需的过滤器,然后使用 ffmpeg 将帧编码回视频。除用户选择过滤器的部分外,一切正常。当用户选择一个过滤器时,应用程序应该显示应用过滤器的视频预览。虽然 450 帧可以相当快地应用过滤器,但以 30 fps 顺序显示图像(让用户感觉视频正在播放)表现不佳。我尝试了不同的方法,但即使在最快的设备上我也能达到的最大帧速率是 10 到 12 fps。

AnimationDrawable 技术在这种情况下不起作用,因为它需要将整个图像缓冲到内存中,这在这种情况下是巨大的。应用程序崩溃。

下面的代码是迄今为止性能最好的代码(10 到 12 fps)。

package com.example.animseqvideo;
import ......

public class MainActivity extends Activity {
Handler handler;
Runnable runnable;
final int interval = 33; // 30.30 FPS
ImageView myImage;
int i=0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

myImage = (ImageView) findViewById(R.id.imageView1);

handler = new Handler();
runnable = new Runnable(){
public void run() {

i++; if(i>450)i=1;

File imgFile = new File(Environment.getExternalStorageDirectory().getPath() + "/com.example.animseqvideo/image"+ String.format("%03d", i) +".jpg");
if(imgFile.exists()){
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
myImage.setImageBitmap(myBitmap);
}
//SOLUTION EDIT - MOVE THE BELOW LINE OF CODE AS THE FIRST LINE OF run() AND FPS=30 !!!

handler.postDelayed(runnable, interval);
}
};
handler.postAtTime(runnable, System.currentTimeMillis()+interval);
handler.postDelayed(runnable, interval);
}
}

我了解到从SDCard获取图像,解码,然后将其显示在屏幕上的过程涉及SDCard读取的性能,设备的CPU性能和图形性能。但我想知道是否有一种方法可以在每次迭代中节省几毫秒。此时任何建议都会有很大帮助。

最佳答案

我也做过类似的事情。我使用了 ValueAnimator。图像是图像 ID 的数组。例如:R.drawable.park1

ValueAnimator animation = ValueAnimator.ofInt(0,44);
animation.setInterpolator(new LinearInterpolator());
animation.setDuration(1000);
animation.setRepeatCount(200);
animation.addUpdateListener(new AnimatorUpdateListener() {
int i;
public void onAnimationUpdate(ValueAnimator animation) {
Log.i("TAG", "::onAnimationUpdate: "+(++i)+" value = "+animation.getAnimatedValue());
mImageViewPreview.setImageResource(images[(Integer) animation.getAnimatedValue()]);
mImageViewPreview.invalidate();

if(mImageViewPreview.getVisibility()!=View.VISIBLE){
animation.cancel();
}
}

});
animation.start();

关于android - 在 android 上以 30fps 显示来自 SDCard 的 450 个图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20490441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com