1

MediaMetadataRetriverクラスを使用してフレームを取得する単純な Android アプリケーションを作成しました。フレームをスキップすることに気付いたことを除いて、正常に動作します。

デコードしようとしているビデオ クリップは、携帯電話のカメラで撮影したワン ショットです。関連するコード スニペットに従ってください。

MediaMetadataRetriever mediaDataRet = new MediaMetadataRetriever();
            mediaDataRet.setDataSource(path);

            String lengthMsStr = mediaDataRet
                    .extractMetadata(mediaDataRet.METADATA_KEY_DURATION);
            final long lenMs = Long.parseLong(lengthMsStr);

            String widthStr = mediaDataRet
                    .extractMetadata(mediaDataRet.METADATA_KEY_VIDEO_WIDTH);
            int width = Integer.parseInt(widthStr);
            String heightStr = mediaDataRet
                    .extractMetadata(mediaDataRet.METADATA_KEY_VIDEO_HEIGHT);
            int height = Integer.parseInt(heightStr);

変数lenMsに注意してください。これは、clid の継続時間をミリ秒単位で保持します。次に、フレームごとに次のことを行います。

                int pace = 30; // 30 fps ms spacing 


                for (long i = 0; i < lenMs; i += pace) {

                    if (is_abort())
                        return;

                    Bitmap bitmap = mediaDataRet.getFrameAtTime(i * 1000); // I tried the other version of this method with OPTION_CLOSEST, with no luck.

                    if (bc == null)
                        bc = bitmap.getConfig();

                    bitmap.getPixels(pixBuffer, 0, width, 0, 0, width, height);
[...]
}

視覚的に確認したところ、一部のフレームがスキップされていることに気付きました (短いシーケンスなど)。なんで?そして、どうすればこれを回避できますか?

4

1 に答える 1