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