2013-02-28 35 views
2

我期待在5秒鐘的視頻中使用MediaMetadataRetriever檢索10幀每秒,並將它們存儲到Arraylist中。我對使用ffmpeg不感興趣。檢索每秒幀數 - Android/MediaMetadataRetriever

目前我的應用程序正在創建50個靜止圖像 - 每秒間隔10個相同的幀,而不是每秒10個不同的幀。

public class FrameCollector { 

MediaMetadataRetriever mmr; 

double fps; 
double duration; 
long counter = 0; 
long incrementer; 

public FrameCollector(String path, Context context) 
{ 
    try 
    { 
    mmr = new MediaMetadataRetriever(); 
    mmr.setDataSource(path); 

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context); 
    String fpsString = pref.getString("prefFPS", "10"); 
    fps = Double.parseDouble(fpsString); 
    incrementer = (long) (1000000/fps); 

    String stringDuration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
    duration = Double.parseDouble(stringDuration) * 1000; 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

public ArrayList<Bitmap> getBitmaps() 
{ 
    try 
    { 
     ArrayList<Bitmap> bitFrames = new ArrayList<Bitmap>(); 

     Bitmap b = mmr.getFrameAtTime(counter); 

     while (counter < duration && b != null) 
     { 
      bitFrames.add(b); 
      counter += incrementer; 
      b = mmr.getFrameAtTime(counter); 
     } 
     return bitFrames; 
    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
     return null; 
    } 
    } 
} 
+2

'getFrameAtTime(counter)'是'getFrameAtTime(counter,OPTION_CLOSEST_SYNC)'的包裝,意味着它只會讀取關鍵幀。嘗試使用'getFrameAtTime(counter,OPTION_CLOSEST)'代替。 – Michael 2013-02-28 13:47:04

+0

非常感謝@邁克爾,完美的工作! – Ledgey1101 2013-02-28 15:08:20

+0

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

回答

0

按照從@邁克爾

評論

「getFrameAtTime(計數器)是getFrameAtTime(計數器,OPTION_CLOSEST_SYNC)的包裝,這意味着將只讀取關鍵幀。嘗試使用getFrameAtTime(計數器,OPTION_CLOSEST)代替「