15

Glide を使用して、ビデオ ファイル内のフレームをステップ実行しようとしています (Android が苦しむキーフレーム シークの問題に遭遇することなく)。ピカソでこれを行うには、次のようにします。

picasso = new Picasso.Builder(MainActivity.this).addRequestHandler(new PicassoVideoFrameRequestHandler()).build();
picasso.load("videoframe://" + Environment.getExternalStorageDirectory().toString() +
                    "/source.mp4#" + frameNumber)
                    .placeholder(drawable)
                    .memoryPolicy(MemoryPolicy.NO_CACHE)
                    .into(imageView);

(frameNumber は、毎回 50000 マイクロ秒ずつ増加する単純な int です)。次のような PicassoVideoFrameRequestHandler もあります。

public class PicassoVideoFrameRequestHandler extends RequestHandler {
public static final String SCHEME = "videoframe";

@Override public boolean canHandleRequest(Request data) {
    return SCHEME.equals(data.uri.getScheme());
}

@Override
public Result load(Request data, int networkPolicy) throws IOException {
    FFmpegMediaMetadataRetriever mediaMetadataRetriever = new FFmpegMediaMetadataRetriever();
    mediaMetadataRetriever.setDataSource(data.uri.getPath());
    String offsetString = data.uri.getFragment();
    long offset = Long.parseLong(offsetString);
    Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(offset, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);
    return new Result(bitmap, Picasso.LoadedFrom.DISK);
}

}

代わりに Glide を使用したいと思います。メモリの処理が少し優れているからです。Glide でこの機能を使用する方法はありますか?

または、実際には、ステップスルーできるビデオからフレームのセットを作成する他の方法です!

ありがとう!

4

3 に答える 3

14

Sam Judd のメソッドを機能させるには、「.override(width, height)」を渡す必要があります。そうしないと、さまざまなアプローチを何時間もテストしたため、ビデオの最初のフレームしか取得できません。誰かの時間を節約できることを願っています。

BitmapPool bitmapPool = Glide.get(getApplicationContext()).getBitmapPool();
int microSecond = 6000000;// 6th second as an example
VideoBitmapDecoder videoBitmapDecoder = new VideoBitmapDecoder(microSecond);
FileDescriptorBitmapDecoder fileDescriptorBitmapDecoder = new FileDescriptorBitmapDecoder(videoBitmapDecoder, bitmapPool, DecodeFormat.PREFER_ARGB_8888);
Glide.with(getApplicationContext())
    .load(yourUri)
    .asBitmap()
    .override(50,50)// Example
    .videoDecoder(fileDescriptorBitmapDecoder)
    .into(yourImageView);
于 2016-01-08T18:22:21.943 に答える
6

フレーム時間 (マイクロ秒単位、MediaMetadataRetriever docsを参照) をVideoBitmapDecoderに渡すことができます。これはテストされていませんが、動作するはずです:

BitmapPool bitmapPool = Glide.get(context).getBitmapPool();
FileDescriptorBitmapDecoder decoder = new FileDescriptorBitmapDecoder(
    new VideoBitmapDecoder(frameTimeMicros),
    bitmapPool,
    DecodeFormat.PREFER_ARGB_8888);

Glide.with(fragment)
    .load(uri)
    .asBitmap()
    .videoDecoder(decoder)
    .into(imageView);
于 2015-06-11T00:04:13.680 に答える