Android 保存视频以及读取视频

 

j最近在Adnroid开发用到了视频的读写操作,记录备忘一下:

都是借用android的med

1、保存TextView到mp4视频

 

2、读取MP4视频

  /**
     * 获取本地视频缩略图
     * @param
     * @return
     */
    public void getVideoThumbnail() {
        //获得当前时间
        int sample = 5;//每秒5帧
        Bitmap bitmap = null;
        MediaMetadataRetriever mmr = new MediaMetadataRetriever();//实例化MediaMetadataRetriever对象
        File file = new File(FileHelper.instance().getVideoFilePath(this));//实例化File对象,文件路径为/storage/sdcard/Movies/video.mp4
        FileOutputStream fos = null;
        File fileGaode = null;
        if(file.exists()){

            mmr.setDataSource(file.getAbsolutePath());//设置数据源为该文件对象指定的绝对路径
            // 取得视频的长度(单位为毫秒)
            String time = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
            // 转换单位为秒)
            int seconds = Integer.valueOf(time) / 1000;
            int dowsample = seconds * sample;
           // Bitmap bitmap = mmr.getFrameAtTime();//获得视频第一帧的Bitmap对象
            // 得到每一秒时刻的bitmap比如第一秒,第二秒
            for (int i = 1; i <= dowsample; i++) {

               bitmap = mmr.getFrameAtTime(i * 1000 * 1000 / sample, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);

               String path = FileHelper.instance().getPicFilePath(this) + "/" + i + ".jpg";

               //保存
                if(bitmap!=null) {
                    try
                    {
                        fos = new FileOutputStream(path);
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                        fos.flush();
                        fos.close();
                    }
                    catch (Exception e)
                    {

                    }
                }
            }

        }else{
            Toast.makeText(MainActivity.this, "文件不存在", Toast.LENGTH_SHORT).show();//文件不存在时,弹出消息提示框
        }
        return bitmap;
    }
    public void saveBitmap2file(Bitmap bmp, String filename) {


        if (bmp == null)
        {
            return;
        }
        String savePath;
        String fileName = filename + ".jpeg";
        savePath = FileHelper.instance().getSDcardPath();

        File filePic = new File(savePath + fileName);
        try {
            if (!filePic.exists()) {
                filePic.getParentFile().mkdirs();
                filePic.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(filePic);
            bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
          //  Toast.makeText(MainActivity., "保存成功,位置:" + filePic.getAbsolutePath(), Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

 

以下为测试在SD卡读写文件

{
                // 在SD卡目录下创建文件
                File file = new File(FileHelper.instance().getSDcardPath(), "mysdcard.txt");
                Log.d(TAG, "file.exists():" + file.exists() + " file.getAbsolutePath():"+ file.getAbsolutePath());
                if (file.exists()) {
                    file.delete();
                    try {
                        file.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                // 在SD卡目录下的文件,写入内容
                FileWriter fw = null;
                try {
                    fw = new FileWriter(file);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    fw.write("我sdcard内容.....");
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Toast.makeText(MainActivity.this, "SD卡写入内容完成...",Toast.LENGTH_LONG).show();
                Log.d(TAG, "SD卡写入内容完成...");


                // 读取SD卡文件里面的内容
                FileReader fr = null;
                try {
                    fr = new FileReader("/mnt/sdcard/mysdcard.txt");
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                BufferedReader r = new BufferedReader(fr);
                String result = null;
                try {
                    result = r.readLine();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Log.d(TAG, "SD卡文件里面的内容:" + result);
                Toast.makeText(MainActivity.this, "SD卡文件里面的内容...",Toast.LENGTH_LONG).show();
                mBtnRecord.setText(result);
}

3、FFmpegMediaMetadataRetriever 也挺好用

https://github.com/wseemann/FFmpegMediaMetadataRetriever

使用

(1)在app下建立libs ,下载aar放进去

 在app的build.gradle的andriod中加入

repositories {
    flatDir {
        dirs 'libs'   // aar目录
    }

 

我的:

android {

    compileSdkVersion 28
    buildToolsVersion '28.0.3'
    defaultConfig {
        applicationId ""
        minSdkVersion 21
        targetSdkVersion versionTarget
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions "
                abiFilters "armeabi-v7a", "arm64-v8a"
                arguments "-DANDROID_STL=gnustl_static" //该处添加gnustl_static,使得可读取opencv JNI的库文件。
            }
            ndk {
                abiFilters "armeabi-v7a", "x86"
            }

        }
    }

    buildTypes {
        release {
            zipAlignEnabled false  //开启优化对齐
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
           
        }
        debug {
            zipAlignEnabled false
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

    sourceSets
            {
                main{
                    jniLibs.srcDirs = ['src/main/jniLibs']
                }
            }

    repositories {
        flatDir {
            dirs 'libs'   // aar目录
        }
    }
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
}

(2)在app的build.gradle中

Add the following maven dependency to your project's build.gradle file:

dependencies {
    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.14'
}

Optionally, to support individual ABIs:

dependencies {
    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever-armeabi:1.0.14'
    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever-armeabi-v7a:1.0.14'
    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever-x86:1.0.14'
    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever-mips:1.0.14'
    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever-x86_64:1.0.14'
    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever-arm64-v8a:1.0.14'
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值