【问题标题】:How can we get frames in Android我们如何在Android中获取帧
【发布时间】:2014-07-09 16:21:51
【问题描述】:

实际上我需要从视频中获取所有帧,但我使用 Mediametadatareteriver,thumbnail,timestamp 获取帧时重复获取第一帧然后特定时间帧。

我通过更改所有 GetFrameAtTime(options) 尝试了很多修复,但保持不变。

我的视频持续时间是 127040(2:07 秒),我拆分为 32 帧并在 SDCard 中保存帧可以查看所有 32 帧,但所有 32 帧重复相同的帧。

我应该在没有 FFMPEG 和 xuggler 的帮助下得到这些。

如果有任何替代方法或任何其他库文件可以在 Android 中使用,请帮助我的朋友。

这是我的完整代码

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;
            fo.write(bytes.toByteArray());

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

            i++;
        }

    }

【问题讨论】:

    标签: android video frame android-sdcard


    【解决方案1】:

    FFmpegMediaMetadataRetriever 应该可以解决您的问题。可以在here 找到一个用于测试的示例 APK。只需单击 sdcard 上的文件,系统将提示您使用演示应用程序打开它。

    要使用该库,只需将this 文件的内容解压到您的项目“libs”文件夹中。并更改您现有的导入语句:

    import android.media.MetadataRetriever;
    

    到:

    import wseemann.media.FFmpegMediaMetadataRetriever;
    

    并改变:

    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    

    到:

    FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever();
    

    【讨论】:

    • 先生,实际上我是 android 新手,尝试了很多使用 Mediametadatareteriver 解决问题,但没有用。
    • 先生,我是 Android 新手,您能指导我吗?我应该在 Eclipse 中包含这个 FFmpegMediaMetadataRetriever 吗?是否有任何代码可以执行此方法
    • 我推荐给你的项目有一个非常详细的自述文件,我建议阅读它。无论如何,我更新了我的答案。
    • 先生,在将 prebuilt.jar 和四个内容文件夹一起导入我的 libs 文件夹后,我收到错误消息为 java.lang.UnsatisfiedLinkError mediaplayer not found 因为我提到了github.com/wseemann/FFmpegMediaPlayer/issues/1 来修复问题,但它仍然是一样的,你能给出解决方案吗?
    • 如果您的项目设置正常,您应该没有问题。如果您需要更多帮助,可以使用我在 github 上的联系信息提交错误报告和/或给我发送电子邮件。
    猜你喜欢
    • 1970-01-01
    • 2020-01-24
    • 2012-08-17
    • 2023-03-23
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多