2012-12-16 78 views
1

我寫了一個簡單的Android應用程序,它使用MediaMetadataRetriver類來獲取幀。它工作正常,除了我意識到它跳過幀。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時間。然後對於每一幀我做的:

   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); 
[...] 
} 

檢查視覺後我注意到,某些幀被跳過(如短序列)。爲什麼?我能避免這種情況嗎?

+0

其實我試過你的上面的代碼來獲取視頻文件中的所有幀,但我只獲得第一幀frames.my視頻持續時間是127040(2:07秒)將視頻分成32幀可以查看所有32個圖像但都是相同的圖像我想了很多與getFrameAtTime(藥劑)修復它,但完全沒有用,確切地說,我不知道它出錯的地方,所以你可以幫助我的完整的源代碼,我應該包括任何東西在AndroidManifest – Manoj

+0

http://stackoverflow.com/a/24307619/3496570可能有幫助 – Nepster

回答

2

用途:

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

getFrameAtTime(n)使用OPTION_CLOSEST_SYNC這將使你唯一的關鍵幀。