22 November 2013

วิธีดึงภาพ Thumbnail จากไฟล์วีดีโอที่อยู่ใน External Storage

Updated on

        ภาพ Thumbnail ก็เหมือนภาพ Preview ของไฟล์ Video ในบางครั้งผู้ที่หลงเข้ามาอ่านอาจจะมีความต้องการให้แอปพลิเคชันแสดงภาพ Thumbnail ของไฟล์วีดีโอในเครื่อง


        บทความนี้จะเป็นการดึงภาพ Thumbnail จากไฟล์วีดีโอที่อยู่ใน External Storage หรือ SD Card ซึ่งขึ้นอยู่กับผู้ที่หลงเข้ามาอ่านกำหนด ซึ่งในตัวอย่างนี้จะกำหนดเป็น External Storage ของอุปกรณ์แอนดรอยด์

        โดยใช้ฟังก์ชันสั้นๆเข้ามาช่วยในการดึงภาพ Thumbnail ดังนี้
public Bitmap getVideoThumbnail(String path) { path = Environment.getExternalStorageDirectory() + path; return ThumbnailUtils.createVideoThumbnail(path, Thumbnails.MINI_KIND); }

        โดยกำหนดเป็นพารามิเตอร์เป็น Path ของไฟล์ใน External Storage แล้วฟังก์ชันนี้จะ Return ค่ากลับมาเป็น Bitmap ที่เป็นภาพ Thumbnail ทีนี้ให้สังเกตุที่ MINI_KIND เป็นการกำหนดขนาดภาพ Thumbnail ซึ่งกำหนดได้สองแบบคือ MINI_KIND กับ MICRO_KIND MINI_KIND จะได้เป็นภาพ Thumbnail ที่มีขนาด 512 x 384 px ส่วน MICRO_KIND จะได้เป็นภาพ Thumbnail ที่มีขนาด 96 x 96 px

        ในการใช้งานก็เพียงแค่กำหนด Path ของไฟล์ใน External Storage ตัวอย่างนี้เจ้าของบล็อกเก็บไฟล์ไว้ที่ /sdcard เลยหรือเรียกได้ว่าเปิดดูไฟล์ปุปเจอปั๊ป ไม่ได้เก็บไว้ในโฟลเดอร์ย่อย


        หมายเหตุ - เนื่องจากใช้ Nexus 4 ที่ไม่สามารถใส่ SD Card เพิ่มได้ แต่ระบบมีการ External Storageให้มองเป็น SD Card ได้ด้วย

        เวลาเจ้าของบล็อกกำหนดที่อยู่ก็จะใส่ /vid.mp4 ไปเลย ถ้าเก็บไวในโฟลเดอร์ย่อยก็ระบุให้ตรงด้วย เช่น / [Folder] / [Folder] / [File]
Bitmap bm = getVideoThumbnail("/vid.mp4");
        เจ้าของบล็อกเรียกใช้ฟังก์ชันดังกล่าวโดยสร้างตัวแปร Bitmap มาเก็บค่าไว้ ดังนั้นตัวแปร bm ก็จะเป็นภาพ Thumbnail ของวีดีโอ vid.mp4 นั่นเอง จากนั้นก็เอามากำหนดใน Image View เลย
Bitmap bm = getVideoThumbnail("/vid.mp4"); ImageView iv = (ImageView)findViewById(R.id.imageView1); iv.setImageBitmap(bm);

        จะเห็นว่า Image View ของเจ้าของบล็อกเป็น R.id.imageView1 เพราะงั้นคงเดาได้ไม่ยากเนอะ ว่าใน Layout ของเจ้าของบล็อกได้กำหนดชื่อ ID ของ Image View ไว้ว่าอะไร ฮาๆ ในหน้า Layout ก็จะมีแค่ Image View อยู่กลางจอเท่านั้นนะ

main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@drawable/ic_launcher" /> </RelativeLayout>

        สำหรับภาพที่กำหนดเป็น ic_launcher นี้เป็นภาพไอคอนเฉยๆ เอามาแสดงชั่วคราว ไม่ได้ใช้งานจริง เพราะเวลาทำงานจริงภาพ Thumbnail จะถูกดึงมาใส่ทับแทน ic_launcher ทันที

        สำหรับโค๊ด Java ก็จะมีแค่นี้ ตามที่ได้อธิบายไปแล้ว

Main.java
package app.akexorcist.videothumbnailsd; import android.media.ThumbnailUtils; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore.Video.Thumbnails; import android.app.Activity; import android.graphics.Bitmap; import android.widget.ImageView; public class Main extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Bitmap bm = getVideoThumbnail("/vid.mp4"); ImageView iv = (ImageView)findViewById(R.id.imageView1); iv.setImageBitmap(bm); } public Bitmap getVideoThumbnail(String path) { path = Environment.getExternalStorageDirectory() + path; return ThumbnailUtils.createVideoThumbnail(path , Thumbnails.MINI_KIND); } }


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="app.akexorcist.videothumbnailsd" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <uses-permission android:name= "android.permission.READ_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="app.akexorcist.videothumbnailsd.Main" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

        พอลองทดสอบดูก็จะพบว่า Image View แสดงภาพ Thumbnail จากวีดีโอได้แล้ว



        สำหรับผู้ที่หลงเข้ามาอ่านคนใดต้องการไฟล์ตัวอย่างสามารถดาวน์โหลดได้ที่ Video Thumbnail SD [Google Drive]