نمایش thumbnail ویدئو آنلاین در Imageview
اگر آنلاین هست که هیچی مستقیم عکس رو از سرور بخونید ولی اگر ویدئو آفلاین هست روش زیر رو پیش بگیرید.
با استفاده از کد زیر آدرس ویدئو رو بهش بدید و Thumbnail رو تحویل بگیرید ، میتونید به یک متد استاتیک در Helper تبدیل کنید .
Bitmap thumb =ThumbnailUtils.createVideoThumbnail(videoPath,MediaStore.Images.Thumbnails.MINI_KIND);
خب من فکر میکردم اضاف کردن فایل JAR کافی باشه < اما توضیحات که بیشتر خوندم لازم هست که فایل ها و بقیه فولدر ها رو هم له libs اضافه کنیم <
با اضافه کردم بقیه < فولدر ها برنامه دیگه کرش نمیکنه < اما هیچ چیزی رو هم نشون نمیده < ! ، توی بعضی موارد برنامه حتی run نمیشه !
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(path);
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ALBUM);
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ARTIST);
b = mmr.getFrameAtTime(2000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); // frame at 2 seconds
byte[] artwork = mmr.getEmbeddedPicture();
mmr.release();
img.setImageBitmap(b);
فکر کنم با نحوه ی اضاف کردن این لایبری به مشکل برخوردم !
طبق توضیحات که داده شده باید فولدر fmmr-library رو به اکلیپس به عنوان لایبری اضاف کرد ، اما اکلیپس این فولدر رو به عنوان یک پروژه نمیشناسه < حتی فولدر fmmr-demo رو هم به عنوان یک پروژه اندروید نمیشناسه <
الان دارم سعی میکنم بصورت دستی fmmr-demo رو وارد کنم <
اگر کسی کد Custom سراغ داره < برای گرفتن ویدئو Thumbnail حتما کمک کنه< کل نت رو زیر رو کردم یا باید از کد محمد حسین بالا استفاده کرد ، که برای اندروید 4 به بالا جواب نمیده < یا باید از این لایبری لاستفاده کرد !
خب بلآخره نتیجه داد < البته برای API +10
oncreate {
.
.
.
new MyAsync().execute(path);
.
.
}
public static Bitmap getVideoFrame(Context context, Uri uri) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(uri.toString(), new HashMap<String, String>());
return retriever.getFrameAtTime();
}
catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
catch (RuntimeException ex) {
ex.printStackTrace();
} finally {
try {
retriever.release();
}
catch (RuntimeException ex) {}
}
return null;
}
public class MyAsync extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... objectURL) {
// return ThumbnailUtils.extractThumbnail(ThumbnailUtils.createVideoThumbnail(objectURL[0], Thumbnails.MINI_KIND), 500, 500);
//Uri uri = Uri.parse("http://hw13.asset.aparat.com/aparat-video/ee4f1aae9630ceb091825ad9fb007d3d2911962-360p__83653.mp4");
Uri uri = Uri.parse(objectURL[0]);
return getVideoFrame(getApplicationContext(), uri);
}
@Override
protected void onPostExecute(Bitmap result) {
img.setImageBitmap(result);
}
}
من target پروژه خودم رو 15 کردم < این د بخوبی روی ورژن های 4 به بالا جواب میده
حالا چطور میتونم این رو JAr کنم و توی Jar چک کنم اگر API دستگاه زیر 10 هست از کد زیر استفاده کنه
Bitmap thumb =ThumbnailUtils.createVideoThumbnail(videoPath,MediaStore.Images.Thumbnails.MINI_KIND);
و اگر Api دستگاه بالا تر از 10 هست از این تیکه کدی که بالا گذاشتم <
باید target رو 10 به بالا بزارید من target=android-15 ست کردم < بعدش دستورات زیر رو
MediaMetadataRetriever که استفاده شده ، توی API 10 وجود داره < لینک
new MyAsync().execute(path); //onCreate
} // on create
public class MyAsync extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... objectURL) {
int sdk = Integer.parseInt(Build.VERSION.SDK);
if (sdk >= 10) {
Uri uri = Uri.parse(objectURL[0]);
return getVideoFrame(getApplicationContext(), uri);
} else {
return ThumbnailUtils.extractThumbnail(ThumbnailUtils.createVideoThumbnail(objectURL[0], Thumbnails.MINI_KIND), 500, 500);
}
}
@Override
protected void onPostExecute(Bitmap result) {
img.setImageBitmap(result);
}
}
public static Bitmap getVideoFrame(Context context, Uri uri) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(uri.toString(), new HashMap<String, String>());
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
int intvalue = Integer.parseInt(time);
String str = String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toMinutes(intvalue),
TimeUnit.MILLISECONDS.toSeconds(intvalue) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(intvalue))
);
Log.i("TIME", "" + str);
return retriever.getFrameAtTime();
}
catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
catch (RuntimeException ex) {
ex.printStackTrace();
} finally {
try {
retriever.release();
}
catch (RuntimeException ex) {}
}
return null;
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .