1
프레임을 얻기 위해 MediaMetadataRetriver
클래스를 사용하는 간단한 Android 애플리케이션을 작성했습니다. 프레임을 건너 뛰는 것을 제외하고는 정상적으로 작동합니다.Android MediaMetadataRetriever.getFrameAtTime 프레임 건너 뛰기
디코딩하려고하는 비디오 클립은 전화 카메라로 촬영 한 것입니다. 관련 코드 조각을 따르
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 기간을 보유하고 있습니다. 이어서 프레임마다 I가 수행
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);
[...]
}
육안 확인 후 I 일부 프레임 (짧은 시퀀스와 같은) 스킵 것을 알아 차렸다. 왜? 그리고 나는 이것을 피할 수 있습니까?
실제로 위의 코드를 비디오 파일의 모든 프레임을 얻으려고했는데 비디오의 첫 번째 프레임 만 반복적으로 재생합니다. 127040 (2 : 07 초)은 32 프레임의 비디오를 32 개의 이미지로 모두 볼 수 있지만 모두 같은 이미지였습니다. getFrameAtTime (포션)으로 고치려고 시도했지만, 전혀 사용하지 않으려 고 시도 했었습니다. 어디에서 잘못 읽었는지 모르겠으니, 안드로이드 매니페스트의 모든 것을 포함시켜야합니다. – Manoj
http://stackoverflow.com/a/24307619/3496570 도움이 될 수 있습니다. – Nepster