2014-05-19 62 views
0

我想從視頻文件中獲取所有圖像幀,以便使用MediaMetaDataReteriver獲取該圖像並將其存儲在帶有幫助ArrayList位圖的SDCard中,但我對使用FFMPEG不感興趣。如何獲取Android中的幀?

其實我需要的是獲得不同幀的圖像,但它重複每次循環運行時相同的第一幀。

要解決這個問題,我在互聯網上搜索和修復,但沒有任何幫助,它仍然是一樣的。

如果有人對此解決方案或其他解決方案有任何解決方法,請幫助我們。

這是我下面全碼:

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Random; 

import android.graphics.Bitmap; 
import android.media.MediaMetadataRetriever; 
import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     File videoFile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Movies/MEMO.mp4"); 

     Uri videoFileUri=Uri.parse(videoFile.toString()); 

     MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
     retriever.setDataSource(videoFile.getAbsolutePath()); 
     ArrayList<Bitmap> rev=new ArrayList<Bitmap>(); 


     //Create a new Media Player 
     MediaPlayer mp = MediaPlayer.create(getBaseContext(), videoFileUri); 
     int millis = mp.getDuration(); 
     for(int i=0;i<millis;i+=100){ 
      Bitmap bitmap=retriever.getFrameAtTime(i,MediaMetadataRetriever.OPTION_CLOSEST); 
      rev.add(bitmap); 

      try { 
       saveFrames(rev); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 
     } 
    } 



    public void saveFrames(ArrayList<Bitmap> saveBitmapList) throws IOException{ 

     String folder = Environment.getExternalStorageDirectory().toString(); 
     File saveFolder = new File(folder + "/Movies/new /"); 
     if(!saveFolder.exists()){ 
      saveFolder.mkdirs(); 
     } 


     int i=1; 
     for (Bitmap b : saveBitmapList){ 
      ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
      b.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 

      File f = new File(saveFolder,("frame"+i+".jpg")); 

      f.createNewFile(); 

      FileOutputStream fo = new FileOutputStream(f); 
      fo.write(bytes.toByteArray()); 

       fo.flush(); 
       fo.close(); 

      i++; 
     } 

    } 
+0

另一種方法:http://bigflake.com/mediacodec/#ExtractMpegFramesTest – fadden

+0

我已經嘗試過了,但你仍然可以幫助我。 – user3627866

+0

先生可以請你幫我通過你的完整示例代碼爲這個過程 – user3627866

回答

0

我認爲時間是microsceconds。表示該參數的US後綴。

所以你需要乘以1,000,000除以幀率。因此,如果幀頻爲30fps:

long timeUS = 1000000 * i/30; 

因此,在你的代碼,這將需要第100幀:

int total_frames = 100; 
for(int f = 0; f < total_frames; f++){ 
    long timeUS = 1000000 * f/30; 
    Bitmap bitmap=retriever.getFrameAtTime(timeUS, MediaMetadataRetriever.OPTION_CLOSEST); 
+0

先生我很抱歉地說你這個我試過了上面的循環條件,這是你給的所有不同的框架,但它仍然是一樣的沒有更改我找不到它是否應該在AndroidManifest中添加任何東西 – user3627866

+0

如果它不起作用,請不要接受。 – weston

+0

主席先生,您可以通過您的示例代碼來幫助我 – user3627866