MediaMetadataRetriever를 사용하여 비디오에서 이미지를 imageView로 설정하려고합니다 .
탐색 막대를 움직일 때마다 프레임을 가져 와서 표시하려고합니다.
mediaMetadataRetriever.getFrameAtTime((int)(33*10),MediaMetadataRetriever.OPTION_CLOSEST);
처음으로 잘 작동하지만 탐색 막대의 진행률을 사용하여 다시 시도하면 작동하지 않습니다. 아래는 내 코드입니다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
seekBar1 = (SeekBar)findViewById(R.id.seekBar1);
imageView1 = (ImageView)findViewById(R.id.imageView1);
File sdcard = Environment.getExternalStorageDirectory();
file = new File(sdcard,"VID_20130922_130050.mp4");
retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(file.getAbsolutePath());
Log.v("", "");
Bitmap bitmap = retriever.getFrameAtTime((int)(33*10),MediaMetadataRetriever.OPTION_CLOSEST);
imageView1.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 480, 320, false));
bitmap.recycle();
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (RuntimeException ex) {
ex.printStackTrace();
}
seekBar1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
String[] params =null;;
if(progress >0)
setImage(progress);
}
});
}
public void setImage(int progress){
Bitmap bitmap = retriever.getFrameAtTime((int)(33*progress),MediaMetadataRetriever.OPTION_CLOSEST);
imageView1.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 480, 320, false));
}
편집하다
질문을 더 잘 설명하기 위해 스크린 샷을 추가합니다. 여기에서는 프레임, videoView 또는 mediaPlayer 사용에 따라 여러 이미지 만 필요합니다.
해상도가 매우 높고 UI 스레드에서만 렌더링했기 때문에 작동하지 않았습니다. Asyn 작업을 사용하여 문제를 해결했습니다.
public class FetchImageInBackground extends AsyncTask<String, String, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = retriever.getFrameAtTime(iProgress,MediaMetadataRetriever.OPTION_CLOSEST);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
setImage(result);
super.onPostExecute(result);
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다