Android 获取视频音频的时长的方法

选择手机系统本地视频,获取视频或音频时间的长度(String类型和int类型)

相关依赖:

    //选择图片、视频、音频第三方图片选择器,glide 4.5.0将代替glide:3.7.0,需修改写法
    implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3'

相关代码: 

 private int themeId;
    private int chooseMode = PictureMimeType.ofVideo();
    private GridImageAdapter adapter;
    private int maxSelectNum = 9;
    private List<LocalMedia> selectList = new ArrayList<>();
    private List<String> videoList = new ArrayList<>();
    private String videoPath;
    private ImageView rimAddIcon,mIvCancelSkip;
    private RoundImageView rimVideoIcon;
    private LinearLayout llDel,mLlSkipLayout;
    private RelativeLayout rlVideoSelect;
    private RelativeLayout rlVideo;
    private TextView tvDuration;
    private int firstNum = 0;
    private String mediaPath;
    private long duration;
    private String flag;
    private LocalMedia media;
    private DynamicByStateBean.DataBean.DynamicsBean dynamicsBean;
    private String userId;
    private TextView mTvRightText;
    private static final int REQUEST_TAKE_VIDEO = 200;
    private String compressedVideoPath;
    private ProgressBar progressBar;
    // 默认隐藏控制栏时间
    private static final int DEFAULT_HIDE_TIMEOUT = 5000;
    // 屏幕宽/高度
    private int mWidthPixels;
  //图片选择器
        themeId = R.style.picture_default_style;
 private void addVideo() {
        int aspect_ratio_x = 1;
        int aspect_ratio_y = 1;
        // 进入相册 以下是例子:不需要的api可以不写
        PictureSelector.create(ReleaseVideoActivity.this)
                .openGallery(chooseMode)// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                .theme(themeId)// 主题样式设置 具体参考 values/styles   用法:R.style.picture.white.style
                .maxSelectNum(maxSelectNum)// 最大图片选择数量
                .minSelectNum(1)// 最小选择数量
                .imageSpanCount(3)// 每行显示个数
                .selectionMode(false ?
                        PictureConfig.MULTIPLE : PictureConfig.SINGLE)// 多选 or 单选
                .previewImage(true)// 是否可预览图片
                .previewVideo(true)// 是否可预览视频
                .enablePreviewAudio(true) // 是否可播放音频
                .isCamera(true)// 是否显示拍照按钮
                .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
                //.imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg
                //.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径
                .enableCrop(false)// 是否裁剪
                .compress(false)// 是否压缩
                .synOrAsy(true)//同步true或异步false 压缩 默认同步
                //.compressSavePath(getPath())//压缩图片保存地址
                //.sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
                .glideOverride(160, 160)// glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度
                .withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
                .hideBottomControls(false ? false : true)// 是否显示uCrop工具栏,默认不显示
                .isGif(true)// 是否显示gif图片
                .freeStyleCropEnabled(true)// 裁剪框是否可拖拽
                .circleDimmedLayer(true)// 是否圆形裁剪
                .showCropFrame(false)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
                .showCropGrid(false)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
                .openClickSound(true)// 是否开启点击声音
                .selectionMedia(selectList)// 是否传入已选图片
                //.isDragFrame(false)// 是否可拖动裁剪框(固定)
//                        .videoMaxSecond(15)
//                        .videoMinSecond(10)
                //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                //.cropCompressQuality(90)// 裁剪压缩质量 默认100
                .minimumCompressSize(100)// 小于100kb的图片不压缩
                //.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效
                //.rotateEnabled(true) // 裁剪是否可旋转图片
                //.scaleEnabled(true)// 裁剪是否可放大缩小图片
                //.videoQuality()// 视频录制质量 0 or 1
                //.videoSecond()//显示多少秒以内的视频or音频也可适用
                //.recordVideoSecond()//录制视频秒数 默认60s
                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
    }

获取视频长度大小代码:

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case PictureConfig.CHOOSE_REQUEST:
                    _showSkipTip(); // 显示跳转提示
                    firstNum = 1;
                    // 图片选择结果回调
                    selectList = PictureSelector.obtainMultipleResult(data);
                    // 例如 LocalMedia 里面返回三种path
                    // 1.media.getPath(); 为原图path
                    // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true
                    // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true
                    // 如果裁剪并压缩了,已取压缩路径为准,因为是先裁剪后压缩的
                    for (LocalMedia media : selectList) {
                        Log.i("图片-----》", media.getPath());
                        mediaPath = media.getPath();
                        //压缩视频 requestCode == REQUEST_TAKE_VIDEO&&
                        double fileOrFilesSize = FileSizeUtil.getFileOrFilesSize(mediaPath, 3);
                        long duration = media.getDuration();//这里得到的是毫秒数
//                        总秒数 = 总毫秒数/1000;
//                        分钟数 = 总秒数/60;
//                        秒数 = 总秒数%60;
                        long duration_zs = duration/1000;//总秒数
                        int duration_m = (int)duration_zs/60;//分钟
                        int duration_s = (int)duration_zs%60;//秒数
                        Log.i("KING","总毫秒数:"+ duration +",全部秒数:"+ duration_zs +" ,"+ duration_m +"分"+ duration_s+"秒");
                        //create destination directory
                        File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + "/Silicompressor/videos");
                        if (f.mkdirs() || f.isDirectory())
                            //compress and output new video specs
                            //判断视频的大小,若太小的话就不需要压缩,否则会出现视频显示异常
                            //小于15MB的视频不压缩处理

                            if (FileSizeUtil.getFileOrFilesSize(mediaPath, 3) < 15) {
                                ToastUtil.show("视频太小,不需要压缩视频");
                                compressedVideoPath = mediaPath;
                            } else {
                                ToastUtil.show("需要压缩视频");
                                new VideoCompressAsyncTask(this).execute(mediaPath, f.getPath());
                            }
                        //
                        this.duration = media.getDuration();
                    }
//                    adapter.setList(selectList);
//                    adapter.notifyDataSetChanged();
                    rimAddIcon.setVisibility(GONE);
                    rimVideoIcon.setVisibility(VISIBLE);
                    rlVideo.setVisibility(VISIBLE);
                    llDel.setVisibility(VISIBLE);
                    tvDuration.setText(DateUtils.timeParse(duration));
//                    Bitmap netVideoBitmap = getNetVideoBitmap(mediaPath);
                    videoPath = mediaPath;
                    if (!TextUtils.isEmpty(videoPath) && et_release_video_text.getText().toString().length() > 0) {
                        mTvRightText.setEnabled(true);
                        setRightText(getResources().getString(R.string.send_button_text), "#F6506C");
                    } else {
                        mTvRightText.setEnabled(false);
                        setRightText(getResources().getString(R.string.send_button_text), "#999999");
                    }
                    setVideoIcon(mediaPath);
                    break;
            }
        }
    }

下面直接进入主题:

MediaPlayer playe = new MediaPlayer();
 // 图片或视频选择结果回调
                    selectList = PictureSelector.obtainMultipleResult(data);
for (LocalMedia media : selectList) {
                        Log.i("图片-----》", media.getPath());
                        mediaPath = media.getPath();
}

获取视频长度方法1:如:8分9秒(可以获取视频的int类型的长度)

 long duration = media.getDuration();//这里得到的是毫秒数
//                        总秒数 = 总毫秒数/1000;
//                        分钟数 = 总秒数/60;
//                        秒数 = 总秒数%60;
                        long duration_zs = duration/1000;//总秒数
                        int duration_m = (int)duration_zs/60;//分钟
                        int duration_s = (int)duration_zs%60;//秒数
                        Log.i("KING","总毫秒数:"+ duration +",全部秒数:"+ duration_zs +" ,"+ duration_m +"分"+ duration_s+"秒");
                        

获取视频长度方法2:string类型的长度,“18:09”

String allTime = getAllTime();//总时长
// 获得视频总时长
    private String getAllTime() {
        SimpleDateFormat sdf;
        int allTime = videoview.getDuration(); // 获取视频时间总长度
        if (allTime <= 0) {
            allTime = 0;
        }
        int hour = allTime / (3600 * 1000);
        if (hour < 0 || hour == 0) {
            sdf = new SimpleDateFormat("mm:ss"); // 转换时间
        } else {
            sdf = new SimpleDateFormat("HH:mm:ss"); // 转换时间
        }
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+00:00")); // 设置中国时区
        String result = sdf.format(allTime); // 将时分秒转换成String类型
        return result;
    }

获取视频长度方法3:

this.duration = media.getDuration();
tvDuration.setText(DateUtils.timeParse(duration));
import java.text.SimpleDateFormat;

public class DateUtils {
    private static SimpleDateFormat msFormat = new SimpleDateFormat("mm:ss");

    public DateUtils() {
    }

    public static String timeParse(long duration) {
        String time = "";
        if (duration > 1000L) {
            time = timeParseMinute(duration);
        } else {
            long minute = duration / 60000L;
            long seconds = duration % 60000L;
            long second = (long)Math.round((float)seconds / 1000.0F);
            if (minute < 10L) {
                time = time + "0";
            }

            time = time + minute + ":";
            if (second < 10L) {
                time = time + "0";
            }

            time = time + second;
        }

        return time;
    }

    public static String timeParseMinute(long duration) {
        try {
            return msFormat.format(duration);
        } catch (Exception var3) {
            var3.printStackTrace();
            return "0:00";
        }
    }

    public static int dateDiffer(long d) {
        try {
            long l1 = Long.parseLong(String.valueOf(System.currentTimeMillis()).substring(0, 10));
            long interval = l1 - d;
            return (int)Math.abs(interval);
        } catch (Exception var6) {
            var6.printStackTrace();
            return -1;
        }
    }

    public static String cdTime(long sTime, long eTime) {
        long diff = eTime - sTime;
        return diff > 1000L ? diff / 1000L + "秒" : diff + "毫秒";
    }
}

 

 

 

发布了347 篇原创文章 · 获赞 280 · 访问量 77万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览