2012-12-16 3 views
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 일부 프레임 (짧은 시퀀스와 같은) 스킵 것을 알아 차렸다. 왜? 그리고 나는 이것을 피할 수 있습니까?

+0

실제로 위의 코드를 비디오 파일의 모든 프레임을 얻으려고했는데 비디오의 첫 번째 프레임 만 반복적으로 재생합니다. 127040 (2 : 07 초)은 32 프레임의 비디오를 32 개의 이미지로 모두 볼 수 있지만 모두 같은 이미지였습니다. getFrameAtTime (포션)으로 고치려고 시도했지만, 전혀 사용하지 않으려 고 시도 했었습니다. 어디에서 잘못 읽었는지 모르겠으니, 안드로이드 매니페스트의 모든 것을 포함시켜야합니다. – Manoj

+0

http://stackoverflow.com/a/24307619/3496570 도움이 될 수 있습니다. – Nepster

답변

2

사용 :

mediaDataRet.getFrameAtTime(i * 1000, MediaMetadataRetriever.OPTION_CLOSEST); 

getFrameAtTime(n)OPTION_CLOSEST_SYNC를 사용하면 키 프레임 만 줄 것입니다.