package com.wistron.WiViewer; import java.util.Date; import Utilities.CSStaticData; import android.R.integer; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.media.MediaMetadataRetriever; import android.media.ThumbnailUtils; import android.net.Uri; import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.Gravity; import android.view.animation.AnimationUtils; import android.widget.SeekBar; import android.widget.Toast; /** * Asynchronous task for loading source video screennail. */ public class LoadVideoFrameTask extends AsyncTask<Object, Integer, Integer> { String TAG="LoadImageTask"; /** * Callback for the completed asynchronous task. */ public interface Callback { void onComplete(long time); } private final Context context; private final Callback callback; MediaMetadataRetriever retriever; Handler handler; long time; public LoadVideoFrameTask(Context context, Callback callback, String filepath,Handler handler) { this.context = context; this.callback = callback; this.handler=handler; MediaMetadataRetriever mretriever = new MediaMetadataRetriever(); mretriever.setDataSource(filepath); retriever=mretriever; } /** * 第一个参数为影片长度,第二个为取几个缩图为5,7或8,第三个为起始时间,第四个为图片大小。第五个为图片偏移 */ @Override protected Integer doInBackground(Object... params) { if (params[0] == null||params[1]==null||params[2]==null||params[3]==null||params[4]==null) { return -1; } int duration=(Integer) params[0]; duration=duration*1000; int ratio= (Integer) params[1]; int start=(Integer) params[2]; Boolean isbase= (Boolean) params[3]; int paraindex= (Integer) params[4]; if(!isbase) { start=(start+(paraindex-10)*1000)*1000; } if(CSStaticData.DEBUG) Log.e(TAG, "[ 初始取帧当前时间点为 ]----->"+start); boolean isright=true; if(params.length==6) { if(params[5]!=null) { isright=false; } } long seperatetime; if(isbase) { seperatetime=duration/ratio; } else { if(start>duration-7000000) { start=duration-7000000; } else if(start<0){ start=0; } seperatetime=1000000; } long time1=new Date().getTime(); for (int i = 0; i < ratio; i++) { if(!isCancelled()) { long a=0; int index=0; if(isright) { a=(start+i*seperatetime); index=paraindex+i; } else { a=(start-i*seperatetime); index=paraindex-i; } if(CSStaticData.DEBUG) Log.e(TAG, "时间为"+a); Bitmap temp=null; if(index>=0&&index<=30) { temp= retriever.getFrameAtTime(a,MediaMetadataRetriever.OPTION_NEXT_SYNC); } if(temp!=null) { Message msg=new Message(); msg.arg1=ratio; msg.arg2=index; if(isbase) { msg.obj= ThumbnailUtils.extractThumbnail(temp, 83, 53); } else { msg.obj= ThumbnailUtils.extractThumbnail(temp, 72, 48); } handler.sendMessage(msg); temp.recycle(); } else { if(CSStaticData.DEBUG) Log.e(TAG,"图片取出为空" ); } } } long time2=new Date().getTime(); time=time2-time1; return 1; } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); } @Override protected void onCancelled() { // TODO Auto-generated method stub if(CSStaticData.DEBUG) Log.e(TAG, "onCancelled called"); super.onCancelled(); retriever.release(); } @Override protected void onPostExecute(Integer result) { String mString="load complite"; if (result == -1) { mString="loading failure"; Toast toast = Toast.makeText(context, mString, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } retriever.release(); callback.onComplete(time); } }