如何在Android中获取框架?

Posted

技术标签:

【中文标题】如何在Android中获取框架?【英文标题】:How to get the frames in Android? 【发布时间】:2014-05-19 12:55:53 【问题描述】:

我正在尝试从视频文件中获取所有图像帧,因为我正在使用 MediaMetaDataReteriver 获取这些图像并将其存储在 SDCard 中,并使用帮助数组列表位图,但我对使用 FFMPEG 不感兴趣。

实际上我需要的是获取不同帧的图像,但每次循环运行时它都会重复相同的第一帧。

为了解决这个问题,我在互联网上搜索并修复了,但没有任何帮助,它保持不变。

如果有人对此或任何其他解决此问题的替代方法有任何想法,请帮助我。

下面是我的完整代码:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity 

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

        File videoFile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Movies/MEMO.mp4");

        Uri videoFileUri=Uri.parse(videoFile.toString());

        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        retriever.setDataSource(videoFile.getAbsolutePath());
        ArrayList<Bitmap> rev=new ArrayList<Bitmap>();


        //Create a new Media Player
        MediaPlayer mp = MediaPlayer.create(getBaseContext(), videoFileUri);
        int millis = mp.getDuration();
        for(int i=0;i<millis;i+=100)
           Bitmap bitmap=retriever.getFrameAtTime(i,MediaMetadataRetriever.OPTION_CLOSEST);
           rev.add(bitmap);

          try 
              saveFrames(rev);
         catch (IOException e) 

            e.printStackTrace();
        
        
    



    public void saveFrames(ArrayList<Bitmap> saveBitmapList) throws IOException

        String folder = Environment.getExternalStorageDirectory().toString();
        File saveFolder = new File(folder + "/Movies/new /");
        if(!saveFolder.exists())
           saveFolder.mkdirs();
        


        int i=1;
        for (Bitmap b : saveBitmapList)
           ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            b.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

            File f = new File(saveFolder,("frame"+i+".jpg"));

            f.createNewFile();

            FileOutputStream fo = new FileOutputStream(f);
            fo.write(bytes.toByteArray());

               fo.flush();
               fo.close();

            i++;
        

    

【问题讨论】:

另一种方法:bigflake.com/mediacodec/#ExtractMpegFramesTest 我试过了,但还是一样,先生,你能帮帮我吗? 先生,请您帮我提供此过程的完整示例代码 【参考方案1】:

我认为时间以微秒为单位。参数上的US 后缀表示这一点。

因此,您需要乘以 1,000,000 并除以帧速率。所以如果帧率为30fps:

long timeUS = 1000000 * i / 30;

所以在您的代码中,这将占用前 100 帧:

int total_frames = 100;
for(int f = 0; f < total_frames; f++)
    long timeUS = 1000000 * f / 30;
    Bitmap bitmap=retriever.getFrameAtTime(timeUS, MediaMetadataRetriever.OPTION_CLOSEST);

【讨论】:

先生,我很抱歉告诉你这个我已经尝试了上面的循环条件,这是你给的以获得所有不同的帧,但它保持不变,我找不到任何变化如果在 AndroidManifest 中添加任何内容就会出错 getFrameAtTime() 的问题在于它真的是用来抓取缩略图的。抓取大量帧有点慢和尴尬。尽管如此,它不应该像描述的那样失败......答案中的代码看起来应该可以解决问题。 实际上我的视频文件持续时间是 127040(2:07 秒) 我将总帧数划分为 (32) 我可以通过将其保存在 SDCard 中将所有 32 帧视为相同的第一帧我不即使在我的 Logcat 中也没有错误消息,也知道哪里出了问题。

以上是关于如何在Android中获取框架?的主要内容,如果未能解决你的问题,请参考以下文章

如何构建Android MVVM 应用框架

android开发问题:如何在当前Acitivity中用代码获取上一个Activity名称?

如何在 Camera2 API Android 5.0 中获取单个预览帧?

android4.4 中如何获取最近应用的缩略图

如何以编程方式从Android上的渐变中获取颜色列表

Android图片框架对比