效果图如下:

获取本地视频

关键代码:

 /*** 重要说明:* <p>* 疑问一:* 该方法,查到的 视频路径 和 视频的缩略图 是一样的,并且格式都是 .mp4 。视频的缩略图应该是 .jpg或.png的后缀啊,* 为什么会这样呢?抱歉,本人查了不少资料,还不知道具体原因。如果您知道原因,欢迎留言,评论。* <p>* <p>* 疑问二:* 除此之外,还有一个问题就是:明明手机的本地是有很多视频,但是有的机型就是查不到。* <p>* 亲测:小米2s,本地是很多视频的,但是获取不到,要么只查到几个,* 而 小米8,魅族note8,就可以查到本地所有的视频。* <p>* 我又下载了 抖音和快手 app,他们也是存在同样的情况:* 小米2s中,该方法从本地查到了2个视频,他们也是只查到了2个视频,其实本地是不止2个视频的。* <p>* 至于为什么有的机型,查不到本地所有的视频呢? 抱歉,同样也是不清楚具体原因。如果您知道原因,欢迎留言,评论。*/private List<LocalVideoBean> getLocalAllVideo() {List<LocalVideoBean> sysVideoList = new ArrayList<>();// MediaStore.Video.Thumbnails.DATA:视频缩略图的文件路径/* String[] thumbColumns = {MediaStore.Video.Thumbnails.DATA,MediaStore.Video.Thumbnails.VIDEO_ID};*/// 视频其他信息的查询条件String[] mediaColumns = {MediaStore.Video.Media._ID,MediaStore.Video.Media.DATA, MediaStore.Video.Media.DURATION, MediaStore.Video.Media.SIZE, MediaStore.Video.Thumbnails.DATA};Cursor cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,mediaColumns, null, null, MediaStore.Video.VideoColumns.DATE_ADDED + " DESC");if (cursor == null) {return sysVideoList;}if (cursor.moveToFirst()) {do {LocalVideoBean info = new LocalVideoBean();info.setPath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)));info.setDuration(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)));info.setSize(cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE)));info.setThumbPath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Thumbnails.DATA)));sysVideoList.add(info);} while (cursor.moveToNext());}cursor.close();return sysVideoList;}

LocalVideoAdapter.java

public class LocalVideoAdapter extends BaseQuickAdapter<LocalVideoBean, BaseViewHolder> {public LocalVideoAdapter(@Nullable List<LocalVideoBean> data) {super(R.layout.item_local_video, data);}@Overrideprotected void convert(BaseViewHolder helper, LocalVideoBean item) {TextView tvTip = helper.getView(R.id.video_tip);ImageView imageView = helper.getView(R.id.image_view);RequestOptions options = new RequestOptions();options.error(R.drawable.default_image).placeholder(R.drawable.default_image).override(130, 130);//说明:虽然获取的视频缩略图的路径,但是真实返回的还是一个视频的路径//因此,这里的file其实是一个视频文件File file = new File(item.getThumbPath());//glid虽然加载的为视频file,但是只会把视频的第一帧的图片加载显示出来//如果这里不想用glide,去显示图片,也可以通过media.getFrameAtTime()方法,获取视频的第一帧,// 参考文章地址:https://blog.csdn.net/bzlj2912009596/article/details/80446256Glide.with(mContext).load(Uri.fromFile(file))//这个方法在华为手机上,没问题。//经过测试发现,在华为手机上,这个方法的加载,直接把手机卡死了,小米8未出现同样问题,//初步判断是太耗内存,上面的方法就没问题。//.load(new File(item.getThumbPath())).apply(options).into(imageView);//bitmap 太大,加载卡顿,不理想//Bitmap videoThumbBit = VideoThumbUtils.getVideoThumb(item.getThumbPath());//Bitmap videoThumbBit = VideoThumbUtils.getVideoThumbnail(item.getThumbPath(), 100, 100);/* Glide.with(mContext).load(videoThumbBit).apply(options).into(imageView);*/helper.setText(R.id.video_duration, TimeUtils.convertSecondsToTime(item.getDuration() / 1000));if (item.getDuration() / 1000 > 15) {tvTip.setVisibility(View.VISIBLE);} else {tvTip.setVisibility(View.GONE);}}}

LocalVideoBean.java

public class LocalVideoBean {private String path;private long duration;private long size;private String thumbPath;private Bitmap bitmap;public long getSize() {return size;}public void setSize(long size) {this.size = size;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public long getDuration() {return duration;}public void setDuration(long duration) {this.duration = duration;}public String getThumbPath() {return thumbPath;}public void setThumbPath(String thumbPath) {this.thumbPath = thumbPath;}public Bitmap getBitmap() {return bitmap;}public void setBitmap(Bitmap bitmap) {this.bitmap = bitmap;}
}

视频剪裁

关键代码:

 //得到视频路径,new 出视频file,我们就可以对视频进行剪裁处理了(文字,滤镜...)//这里推荐一个开源框架,Android-Video-Trimmer: https://github.com/iknow4/Android-Video-Trimmer 还不错。// 缺点是:使用ffmpeg进行视频裁剪。会让你的app增大许多,20-30Mprivate void videoCrop(String videoPath) {if (!TextUtils.isEmpty(videoPath)) {Bundle bundle = new Bundle();bundle.putString(VIDEO_PATH_KEY, videoPath);Intent intent = new Intent(MainActivity.this, VideoTrimmerActivity.class);intent.putExtras(bundle);startActivityForResult(intent, VIDEO_TRIM_REQUEST_CODE);}}

结果处理关键代码:

@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);Log.i(TAG, "onActivityResult: requestCode=" + requestCode + " resultCode=" + resultCode);if (resultCode == RESULT_OK && requestCode == 66) {if (data != null) {LocalVideoBean localVideoBean = getVideoPath(data);tvPath.setText("视频路径:\n" + localVideoBean.getPath() + "\n\n" + " 视频缩略图路径:\n" + localVideoBean.getThumbPath());videoCrop(localVideoBean.getPath());} else {Toast.makeText(this, "data is null", Toast.LENGTH_SHORT).show();}} else if (requestCode == VIDEO_REQUESTCODE && resultCode == 11) {String video_path = data.getStringExtra("video_path");String poster_path = data.getStringExtra("poster_path");tvPath.setText("视频路径:\n" + video_path + "\n\n" + " 视频缩略图路径:\n" + poster_path);videoCrop(video_path);} else if (requestCode == VIDEO_REQUESTCODE && resultCode == 22) {//拍摄的视频路径,可以返回到这里} else if (requestCode == VideoTrimmerActivity.VIDEO_TRIM_REQUEST_CODE && resultCode == RESULT_OK) {if (data != null) {String clippingPath = data.getStringExtra("clippingPath");tv_clipping_path.setText("剪裁结果路径:\n" + clippingPath);}}}

视频拍摄

VideoRecorder

WeiXinRecordedDemo

CameraView :https://github.com/CJT2325/CameraView
说明:截止2019-02-25 start 1.7k 最新更新于2年前

CameraView :https://github.com/natario1/CameraView
说明:截止2019-02-25 start 1.7k 最新更新于几天前

cameraview: https://github.com/google/cameraview
说明:截止2019-02-25 start 4.2k 最新更新于2年前


项目源码

ps:项目源码中,都已经做了很详细的说明。

【Android 获取本地视频+视频剪裁+视频录制】相关推荐

  1. Android获取本地相册中图片视频

    权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> < ...

  2. Android获取本地相册图片

    Android获取本地相册图片 第一步设置静态权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_S ...

  3. iOS 获取本地相册图片或视频

    1.先判断iOS 相机相册的权限检测 相关链接 https://www.jianshu.com/p/8a944534e0ee 2.iOS 获取本地相册图片 iOS 获取本地相册图片一 iOS 获取本地 ...

  4. Android获取本地图片缩略图终极解决方案

    QAQ学Android真的还是要在项目中获得锻炼,脱离实际一切都是耍流氓哼唧~! 花了一下午时间搞定了项目中要实现的:获取本地图片缩略图并显示在ListView上的,并且点击要能获得该图片文件路径功能 ...

  5. android获取本地图片并显示图片

    亲测可用,若有疑问请私信 import java.io.FileNotFoundException;import android.content.ContentResolver; import and ...

  6. Android 获取本地外网IP、内网IP、计算机名等信息

    一.获取本地外网IP public static String GetNetIp() { URL infoUrl = null; InputStream inStream = null; try { ...

  7. android获取本地所有视频,各位大神们 android怎么获取手机本地视频啊?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 String progress[]={ MediaStore.Video.Media.DISPLAY_NAME,//视频的名字 MediaStore.Vi ...

  8. Android 获取文件,图片,视频大小

    直接上代码 public class FileSizeUtil {private static final String TAG=FileSizeUtil.class.getSimpleName(); ...

  9. android 获取本地音乐,Android 获取本地音乐

    获取到Android设备的本地音乐,并显示音乐的时长,专辑图片,音乐名字以及歌手姓名等.当设备从播放器中下载音乐的时候,这些信息都会存储到设备中.我们获取的时候可以通过设备暴露给我们的ContentP ...

最新文章

  1. 中兴高达和中兴啥关系_41家通信传输设备公司研发投入排名:中兴通讯、烽火通信最敢投...
  2. Pandas 基础(8) - 用 concat 组合 dataframe
  3. 如何写好一份工程师简历
  4. 面向对象的特点_java基础 之 面向对象
  5. 关于计算机的英语作文初中,computer初中英语作文范文
  6. c语言大刀符号程序,特殊符号大刀图案 | 手游网游页游攻略大全
  7. 11月4日绿健简报,星期五,农历十月十一
  8. 《阿丽塔:战斗天使》:人类与机器人真的有爱情吗?
  9. vue 抽离公共方法
  10. Attention机制原理
  11. HDU6069 欧拉筛法+约数定理+计算技巧。
  12. 菜鸟 Linux系统学习1简介 安装 云服务器 启动过程
  13. 【回忆杀】程序员书房翻杂物,看到初恋的信件,看到奖牌,看到梅西、力宏,他的眼角又湿了.....
  14. 《InnoDB存储引擎》第五章——索引与算法
  15. 如何通过API方式集成金蝶ERP
  16. ActiveSync同步Emulator
  17. c语言做土壤湿度传感器程序,单片机土壤湿度传感器设计 程序编译错误
  18. Kubernetes — Dashboard
  19. 毫无破绽!用这个开源项目换了张脸后,连女朋友都难分真假,能否骗过刷脸支付?...
  20. 第一阶冲刺段结束后,对于其他组作品的建议

热门文章

  1. Camera镜像上下左右颠倒问题的解决办法
  2. 巧妙使用excel 实现行转列
  3. Windows XP系统蓝屏报错代码大全
  4. FLStudio水果21最新Daw (宿主软件)电音混音编曲制作工具
  5. 软件项目管理 第12讲 软件项目跟踪
  6. 存下吧,很难找到的!早晚有人问你!
  7. 教程:腾讯云使用WordPress从零开始建站-黑科鸡Blog(一)
  8. baocms伪静态_BAOcms7.0 O2O本地生活服务系统钻石版源码 无限制版 功能强大
  9. android同步ios备忘录,简单iOS备忘录App实现
  10. mysql自增不连续的问题