使用https://github.com/mabeijianxi/small-video-record项目来实现视频录制与压缩,博主博客:利用FFmpeg玩转Android视频录制与压缩(一) - CSDN博客 http://blog.csdn.net/mabeijianxi/article/details/63335722

下面主要讲解如何把此项目引进自己的工程并做适当修改为符合自身项目滴。

博主讲解了使用方法https://github.com/mabeijianxi/small-video-record使用方法中文文档,此处纯粹记录一下自己引进的具体步骤。

使用导入SmallVideoLib2的方法实现。

引进步骤:

1.下载源码GitHub - mabeijianxi/small-video-record: 利用FFmpeg视频录制微信小视频与其压缩处理 https://github.com/mabeijianxi/small-video-record下面的操作使用的是SmallVideoRecord2的源代码。

2.新建一个自己的项目,此处名为“TestDemo”, 使用Androidstudio2.3.3

3.把“SmallVideoRecord2”工程里的"all_lib"文件夹

拷进自己的工程“TestDemo"中

4.为自己的工程引进module——SmallVideoLib2

5.把“SmallVideoRecord2”工程里的“sample”中的与界面布局、activity代码相关的东西全部复制进自己的工程,然后刷新运行程序,完成啦~~~,接下来就是研究理解源代码,为自己的项目定制功能啦

修改:

1.视频文件保存路径
博主原先是保存在SD卡DCIM文件下的,改为指定文件夹保存。
先添加两个方法,用于生成或获得指定的文件夹路径:

 /*** 获取SD卡路径** @return*/public static String getSDPath() {File sdDir = null;// 判断sd卡是否存在boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);if (sdCardExist) {sdDir = Environment.getExternalStorageDirectory();//获取根目录return sdDir.toString();}return null;}/*** 获取录制视频的路径* @return*/public static String getVideoRecordDir(){String dirPath = getSDPath();dirPath += "/" + "videorecordcompress";File file = new File(dirPath);if(!file.exists()){file.mkdir();}dirPath +="/"+"videorecord";file = new File(dirPath);if(!file.exists()){file.mkdir();}return dirPath;}

private static File recordDir;//录制文件
在MainActivity中的initSmallVideo方法中进行接下来的修改:

 public static void initSmallVideo() {// 设置拍摄视频缓存文件夹的路径
//        File dcim = Environment
//                .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
//        if (DeviceUtils.isZte()) {
//            if (dcim.exists()) {
//                JianXiCamera.setVideoCachePath(dcim + "/mabeijianxi/");
//            } else {
//                JianXiCamera.setVideoCachePath(dcim.getPath().replace("/sdcard/",
//                        "/sdcard-ext/")
//                        + "/mabeijianxi/");
//            }
//        } else {
//            JianXiCamera.setVideoCachePath(dcim + "/mabeijianxi/");
//        }recordDir = new File(getVideoRecordDir());        JianXiCamera.setVideoCachePath(recordDir.getAbsolutePath());       // 初始化拍摄JianXiCamera.initialize(false, null);}

2.为录制的视频指定名字

在MediaRecorderActivity中的initMediaRecorder方法里修改:
先添加此方法:

/**获取系统时间- 视频保存的时间*/public static String getCurrentDate() {SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");Date curDate = new Date(System.currentTimeMillis());String date = formatter.format(curDate);return date;}

再修改key的值:

        if (!FileUtils.checkFile(f)) {f.mkdirs();}//录制的视频名字、路径String key = getCurrentDate(); //String.valueOf(System.currentTimeMillis());mMediaObject = mMediaRecorder.setOutputDirectory(key,JianXiCamera.getVideoCachePath() + "/" + key);mMediaRecorder.setSurfaceHolder(mSurfaceView.getHolder());mMediaRecorder.prepare();//录制的视频名字、路径String key = getCurrentDate(); //String.valueOf(System.currentTimeMillis());mMediaObject = mMediaRecorder.setOutputDirectory(key,JianXiCamera.getVideoCachePath() + "/" + key);mMediaRecorder.setSurfaceHolder(mSurfaceView.getHolder());mMediaRecorder.prepare();

3.压缩指定路径下的视频
原先是打开文件选择对话框,进行选择任一视频。

 /*** 压缩指定视频文件* @param videoFilePath*/private void compressVideo(String videoFilePath){File file = new File(videoFilePath);if(!file.exists()){Toast.makeText(this, "视频文件不存在,无法执行压缩操作", Toast.LENGTH_SHORT).show();return;}BaseMediaBitrateConfig compressMode = null;int compressModeCheckedId = rg_only_compress_mode.getCheckedRadioButtonId();if (compressModeCheckedId == R.id.rb_cbr) {String bitrate = et_only_compress_bitrate.getText().toString();if (checkStrEmpty(bitrate, "请输入压缩额定码率")) {return;}compressMode = new CBRMode(166, Integer.valueOf(bitrate));} else if (compressModeCheckedId == R.id.rb_auto) {String crfSize = et_only_compress_crfSize.getText().toString();if (TextUtils.isEmpty(crfSize)) {compressMode = new AutoVBRMode();} else {compressMode = new AutoVBRMode(Integer.valueOf(crfSize));}} else if (compressModeCheckedId == R.id.rb_vbr) {String maxBitrate = et_only_compress_maxbitrate.getText().toString();String bitrate = et_only_compress_bitrate.getText().toString();if (checkStrEmpty(maxBitrate, "请输入压缩最大码率") || checkStrEmpty(bitrate, "请输入压缩额定码率")) {return;}compressMode = new VBRMode(Integer.valueOf(maxBitrate), Integer.valueOf(bitrate));} else {compressMode = new AutoVBRMode();}if (!spinner_only_compress.getSelectedItem().toString().equals("none")) {compressMode.setVelocity(spinner_only_compress.getSelectedItem().toString());}String sRate = et_only_framerate.getText().toString();String scale = et_only_scale.getText().toString();int iRate = 0;float fScale = 0;if (!TextUtils.isEmpty(sRate)) {iRate = Integer.valueOf(sRate);}if (!TextUtils.isEmpty(scale)) {fScale = Float.valueOf(scale);}LocalMediaConfig.Buidler buidler = new LocalMediaConfig.Buidler();final LocalMediaConfig config = buidler.setVideoPath(videoFilePath).captureThumbnailsTime(1).doH264Compress(compressMode).setFramerate(iRate).setScale(fScale).build();new Thread(new Runnable() {@Overridepublic void run() {runOnUiThread(new Runnable() {@Overridepublic void run() {showProgress("", "压缩中...", -1);}});OnlyCompressOverBean onlyCompressOverBean = new LocalMediaCompress(config).startCompress();runOnUiThread(new Runnable() {@Overridepublic void run() {hideProgress();}});Intent intent = new Intent(MainActivity.this, SendSmallVideoActivity.class);intent.putExtra(MediaRecorderActivity.VIDEO_URI, onlyCompressOverBean.getVideoPath());intent.putExtra(MediaRecorderActivity.VIDEO_SCREENSHOT, onlyCompressOverBean.getPicPath());startActivity(intent);}}).start();}

修改MainActivity中的choose方法:

public void choose(View v) {//        Intent it = new Intent(Intent.ACTION_GET_CONTENT,
//                android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
//
//        it.setDataAndType(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "video/*");
//        startActivityForResult(it, CHOOSE_CODE);String videoFilePath = recordDir.getAbsolutePath() + "/videorecord1519898039101/1519898039101.mp4";compressVideo(videoFilePath);}

4.为压缩视频指定保存的路径

  private static File compressDir;//压缩文件
/*** 获取SD卡路径** @return*/public static String getSDPath() {File sdDir = null;// 判断sd卡是否存在boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);if (sdCardExist) {sdDir = Environment.getExternalStorageDirectory();//获取根目录return sdDir.toString();}return null;}
/*** 获取压缩视频的路径* @return*/public static String getVideoCompressDir(){String dirPath = getSDPath();dirPath += "/" + "videorecordcompress";File file = new File(dirPath);if(!file.exists()){file.mkdir();}dirPath +="/"+"videocompress";file = new File(dirPath);if(!file.exists()){file.mkdir();}return dirPath;}

在JianXiCamera里添加:

/** 视频压缩路径 */private static String mVideoCompressPath;/** 获取视频压缩文件夹 */public static String getVideoCompressPath() {return mVideoCompressPath;}/** 设置视频压缩路径 */public static void setVideoCompressPath(String path) {File file = new File(path);if (!file.exists()) {file.mkdirs();}mVideoCompressPath = path;}

现在MainActivity中的initSmallVideo方法就应该为:

public static void initSmallVideo() {// 设置拍摄视频缓存文件夹的路径
//        File dcim = Environment
//                .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
//        if (DeviceUtils.isZte()) {
//            if (dcim.exists()) {
//                JianXiCamera.setVideoCachePath(dcim + "/mabeijianxi/");
//            } else {
//                JianXiCamera.setVideoCachePath(dcim.getPath().replace("/sdcard/",
//                        "/sdcard-ext/")
//                        + "/mabeijianxi/");
//            }
//        } else {
//            JianXiCamera.setVideoCachePath(dcim + "/mabeijianxi/");
//        }recordDir = new File(getVideoRecordDir());compressDir = new File(getVideoCompressDir());JianXiCamera.setVideoCachePath(recordDir.getAbsolutePath());JianXiCamera.setVideoCompressPath(compressDir.getAbsolutePath());// 初始化拍摄JianXiCamera.initialize(false, null);}

5.修改压缩视频的名字:
在LocalMediaCompress里的public OnlyCompressOverBean startCompress() 方法中进行修改key的值:

File f = new File(JianXiCamera.getVideoCachePath());if (!FileUtils.checkFile(f)) {f.mkdirs();}//压缩后的视频文件名字、路径String key = getCurrentDate();//String.valueOf(System.currentTimeMillis());mMediaObject = setOutputDirectory(key,JianXiCamera.getVideoCompressPath() + "/" + key);mMediaObject.setOutputTempVideoPath(mNeedCompressVideo);
/*** 获取系统时间- 视频保存的时间** @return*/public static String getCurrentDate() {SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");Date curDate = new Date(System.currentTimeMillis());String date = formatter.format(curDate);return date;}

6.其他一些修改就不写了,花时间慢慢研究肯定值得滴

推荐学习网址:

1.首先肯定是使用的源代码博主滴博客啦( ̄▽ ̄)/利用FFmpeg玩转Android视频录制与压缩(一) - CSDN博客 http://blog.csdn.net/mabeijianxi/article/details/63335722
2.在视频影音方面特别厉害的博主最简单的基于FFmpeg的移动端例子:Android HelloWorld - CSDN博客 http://blog.csdn.net/leixiaohua1020/article/details/47008825/

视频:使用FFMpeg实现视频录制与压缩相关推荐

  1. 手机录屏视频用ffmpeg进行视频截取以及旋转

    我是用Ubuntu系统进行命令行操作: 1.视频截取:ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss hh:mm:ss -to hh:mm:ss o ...

  2. ffmpeg处理视频与声音

    1.ffmpeg将mp4分解成多张jpg图片 要在游戏中播放视频,引擎竟然不支持.琢磨了一下,干脆将视频图片提取出来,然后用Animation动画类来播放这些图片,这样也能实现播放视频的效果.还是ff ...

  3. ffmpeg获取视频时长和分辨率

    文章目录 ffmpeg获取视频文件时长和分辨率 获取视频时长 获取视频分辨率 ffmpeg获取视频文件时长和分辨率 获取视频时长 import os import subprocess# video_ ...

  4. ffmpeg分割视频,制作gif图,加水印、去水印,视频拼接

    一.分割视频 进入ffmpeg的目录: (1)执行从0分钟开始,剪切5分钟: ./ffmpeg -ss 00:00:00 -i /111/Movies/a2009.mp4 -t 00:05:00 a2 ...

  5. 利用FFmpeg玩转Android视频录制与压缩(二)

    请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个 ...

  6. 利用FFmpeg玩转Android视频录制与压缩(三)

    请尊重原创,转载请注明出处http://blog.csdn.net/mabeijianxi/article/details/73011313 前言 上一回说到啊,这千秋月没是佳人离别,时逢枯枝落旧城, ...

  7. 用FFmpeg玩转Android视频录制与压缩

    [置顶] 利用FFmpeg玩转Android视频录制与压缩(二) 标签: Android视频采集Android视频编码Android FFmpegAndroid 视频压缩视频编码 2017-06-10 ...

  8. 利用FFmpeg玩转Android视频录制与压缩

    本文为剑西独家授权发布,剑西也是做Android多媒体开发,算是同道中人,不过他主要集中在视频压缩,利用FFmpeg,能做很多事,但是做到效果好,却不多.今天看下他的分享,剑西的blog是:http: ...

  9. ffmpeg 转换flv压缩大小_视频压缩工具ffmpeg的使用

    这篇文章中的视频压缩非常适用于教学视频的压缩,因为教学视频中很多帧数的内容都是相同的. 本文作者的CPU是E5-2670,8核16线程.视频压缩工具ffmpeg可以充分利用多线程性能. 原文件大小:1 ...

  10. iOS视频录制、压缩、上传(整理)

    iOS视频录制.压缩.上传(整理) 我们在项目中有时会碰到视频相关的需求,一般的可以分为几种情况: 1. 简单的视频开发,对界面无要求,可直接使用系统UIImagePickerController. ...

最新文章

  1. 2020年度“中国神经科学重大进展”获奖名单【附成果介绍】
  2. 修改域名dns服务器,新网互联域名如何修改DNS设置方法
  3. symfony开发步骤简述
  4. 《机器学习》 周志华学习笔记第六章 支持向量机(课后习题)python 实现
  5. DataTabel中关于ImpotRow的一点尝试
  6. OpenCV鼠标事件和滑动条事件
  7. VC++六种Runtime Library
  8. plaintextedit指定一行一行的高亮显示_列表记录自动逐条高亮显示
  9. python stdin read_python 3:使用readahead从stdin管道读取字节
  10. 算法图解学习笔记01之二分查找
  11. ASP.NET MVC学习
  12. 直线的两点式、一般式以及点到直线的垂点
  13. Java与完成端口IOCP
  14. 802.11 Beacon帧
  15. Mac将本地文件上传到服务器以及从服务器下载文件到本地
  16. 驾驶习惯也能识人?基于时空孪生神经网络的轨迹识别
  17. linux 韦恩图两个,nVenn:绘制广义的准比例维恩图
  18. 今日头条视频地址提取 谷歌插件
  19. 混合式学习,以学习者为中心的新型教学形式
  20. 32位64位Eclipse和jdk对应关系说明【初学者适用】

热门文章

  1. Multi-modality Latent Interaction Network for Visual Question Answering阅读笔记
  2. X15 - 999、马克思主义基本原理概论、03709
  3. Spark面试题修改版本
  4. 4.(地图数据篇)nginx代理地图服务--离线部署地图服务
  5. 语音特征:mfcc、fbank和语谱图概述
  6. 勾股定理,西方称为毕达哥拉斯定理
  7. MySql 8.0对应的驱动包
  8. 成都链安xFootprint 2022 Web3 安全研报
  9. oracle10g没有行列转换函数的替代方法(转)
  10. 回想那些年我抛弃的技术