2014-05-21 58 views
2

其實我需要從視頻中獲取所有幀,但我使用重複獲取第一幀,然後使用Mediametadatareteriver,縮略圖,時間戳獲取幀的特定時間幀。我們如何在Android中獲取幀

我試了很多修改所有GetFrameAtTime(選項),但保持不變。

我的視頻持續時間是127040(2:07秒)這裏我分成32幀並保存SD卡中的幀可以查看所有32幀,但是對於所有32幀都重複相同的幀。

我應該得到這些沒有FFMPEG和xuggler的幫助。

是否有任何替代方法或任何其他庫文件在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; 
      fo.write(bytes.toByteArray()); 

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

      i++; 
     } 

    } 

回答

1

FFmpegMediaMetadataRetriever應該解決您的問題。要測試的示例APK可以找到here。只需點擊SD卡上的文件,系統就會提示您使用演示應用程序打開它。

要使用該庫,只需將this文件的內容解壓到項目「庫」文件夾中即可。並改變現有的import語句從:

import android.media.MetadataRetriever; 

到:

import wseemann.media.FFmpegMediaMetadataRetriever; 

和改變:

MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 

到:

FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever(); 
+0

爵士其實我是新來的android使用Mediametadatareteriver但嘗試了很多解決問題的方法o使用。 – Manoj

+0

先生,我是新來的Android,你可以引導我請,如果我應該在Eclipse中包含FFmpegMediaMetadataRetriever,並且是否有任何代碼來執行此方法 – Manoj

+0

我推薦給你的項目有一個非常詳細的自述文件,我建議閱讀。無論如何,我更新了我的答案。 –

相關問題