關(guān)于視頻裁剪方面的介紹文章比較少搁胆,開源項目更是少之又少,如果公司有相關(guān)的業(yè)務需求實施起來還是有點棘手隘击。本博客就是簡單的說說與視頻裁剪有關(guān)的技術(shù)脊串。
視頻裁剪項目:https://github.com/iknow4/Android-Video-Trimmer
這是我的github上發(fā)布的一個視頻裁剪的項目,我們就按照項目的實現(xiàn)方式以及結(jié)合源碼躏尉,來說一下涉及到的相關(guān)技術(shù)點蚯根。
先貼一張效果圖:
效果圖有點模糊,勉強可以用胀糜。效果跟Twitter颅拦,Youtube的視頻裁剪類似,當然教藻,大公司這方面做的更加出色了距帅。
項目分為 1. 視頻選擇頁,2.視頻裁剪頁括堤。
1.視頻選擇頁碌秸,如何獲取所有的視頻?
Android系統(tǒng)四大組件之一 ContentProviders 使得我們能跨進程去獲取系統(tǒng)所有的視頻文件悄窃。
public static ArrayList<VideoInfo> getAllVideoFiles(Context mContext) {
VideoInfo video;
ArrayList<VideoInfo> videos = new ArrayList<>();
ContentResolver contentResolver = mContext.getContentResolver();
try {
Cursor cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null,
null, null, MediaStore.Video.Media.DATE_MODIFIED + " desc");
while (cursor.moveToNext()) {
video = new VideoInfo();
if (cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DURATION)) != 0) {
video.setDuration(cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DURATION)));
video.setVideoPath(cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA)));
video.setCreateTime(cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATE_ADDED)));
video.setVideoName(cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME)));
videos.add(video);
}
}
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
return videos;
}
取到ContentResolver引用讥电,調(diào)用查詢方法,按照視頻的修改時間排序轧抗,最新修改的放在最前面允趟。上面讀取所有視頻文件的方式需要設(shè)計成異步,可以采AsyncTask鸦致,否則如果視頻文件量大,會導致阻塞主線程涣楷,從而導致應用的體驗下降分唾。VideoInfo是我定義的一個視頻文件的載體類:
private long videoId;
private String videoName = "";
private String authorName = "";
private String description = "";//視頻全路徑,包含視頻文件名的路徑信息
private String videoPath;//視頻所在文件夾的路徑
private String videoFolderPath;
private String createTime;
private long duration = 0;
private String thumbPath;
private int rotate;
private String lat;
private String lon;
該類用于存放視頻的相關(guān)信息。比如狮斗,視頻的路徑绽乔,視頻名稱,視頻的經(jīng)緯度碳褒,等等折砸。獲取所有視頻之后我們需要將之展示出來看疗,視頻的封面圖我是用universalimageloader來展示的。有關(guān)universalimageloader的工作方式可以看一下我的另一篇博客:
帶你細細品讀Android-Universal-Image-Loader源碼
有意思的是在ImageLoader內(nèi)部睦授,會自動判斷你傳入的圖片url两芳,如果是video的,ImageLoader會獲取視頻的第一幀進行顯示去枷。有興趣的同學可以去閱讀一下源碼怖辆,源碼類:com.nostra13.universalimageloader.core.download.BaseImageDownloader.java
2.視頻裁剪頁
視頻裁剪頁相對來比較復雜,涉及的內(nèi)容有:
1.VideoView
2.視頻幀讀取
3.視頻幀的顯示(com.iknow.android.widget.VideoThumbHorizontalListView)
4.視頻播放進度SeekBar
5.視頻裁剪控件(com.iknow.android.widget.RangeSeekBarView)
有興趣的同學可以先fork我的項目來看看删顶。
我會在下一篇博客對 視頻裁剪頁 進行展開講述竖螃。
歡迎關(guān)注我的簡書博客:http://www.reibang.com/users/aea57293503d/latest_articles