2

MediaMetadataRetriever を使用して 5 秒のビデオで 1 秒あたり 10 フレームを取得し、それらを Arraylist に格納しようとしています。ffmpeg の使用には興味がありません。

現在、私のアプリケーションは 50 個の静止画像を作成しています。毎秒 10 個の異なるフレームではなく、毎秒間隔で 10 個の同一フレームです。

public class FrameCollector {

MediaMetadataRetriever mmr;

double fps;
double duration;
long counter = 0;
long incrementer;

public FrameCollector(String path, Context context) 
{
    try
    {
    mmr = new MediaMetadataRetriever();
    mmr.setDataSource(path);

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
    String fpsString = pref.getString("prefFPS", "10");
    fps = Double.parseDouble(fpsString);
    incrementer = (long) (1000000 / fps);

    String stringDuration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
    duration = Double.parseDouble(stringDuration) * 1000;
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }
}

public ArrayList<Bitmap> getBitmaps() 
{
    try 
    {
        ArrayList<Bitmap> bitFrames = new ArrayList<Bitmap>();

        Bitmap b = mmr.getFrameAtTime(counter);

        while (counter < duration && b != null) 
        {
            bitFrames.add(b);
            counter += incrementer;
            b = mmr.getFrameAtTime(counter);
        }
        return bitFrames;   
    }
    catch (Exception ex) 
    {
        ex.printStackTrace();
        return null;
    }
  }
}
4

1 に答える 1

1

@Michael からのコメントによると

「getFrameAtTime(counter) は getFrameAtTime(counter, OPTION_CLOSEST_SYNC) のラッパーです。つまり、キーフレームのみを読み取ります。代わりに getFrameAtTime(counter, OPTION_CLOSEST) を使用してみてください」

于 2013-03-12T15:38:58.673 に答える