2014-05-19 2 views
0

나는 비디오 카드에서 MediaMetaDataReteriver를 사용하여 이미지를 가져 와서 도움이되는 arraylist Bitmap으로 SDCard에 저장하려고하는데, FFMPEG를 사용하는 것에 관심이 없다.안드로이드에서 프레임을 얻는 방법?

사실 내가 필요한 것은 다른 프레임의 이미지를 얻는 것이지만 루프가 실행될 때마다 동일한 첫 번째 프레임을 반복합니다.

이 문제를 해결하기 위해 인터넷에서 많은 부분을 검색하고 수정했지만 아무 것도 도움이되지 않았습니다.

이 문제를 해결하기위한 다른 방법이나 다른 방법에 대한 아이디어가 있으시면 저에게 도움을주십시오. 나는 시간이 microsceconds에 생각

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

:

여기 아래에있는 내 전체 코드입니다. 그것을 나타내는 인수에 US 접미사.

그래서 1,000,000을 곱하여 프레임 속도로 나누어야합니다.

long timeUS = 1000000 * i/30; 

그래서 코드에서,이 걸릴 것이라고 처음 100 프레임 : 프레임 속도는 초당 30 프레임입니다 그래서 만약

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

선생님 죄송합니다. 위의 루프 조건을 시도해 보았습니다. 모든 다른 프레임을 얻으려고했지만 동일한 것은 아닙니다. 변경 안드로이드 Manifest에 어떤 것이 추가되어야한다면 잘못되었다는 것을 발견 할 수 없다. – user3627866

+0

작동하지 않는다면 받아들이지 않는다. – weston

+0

선생님, 샘플 코드로 도울 수 있습니까? – user3627866

관련 문제