视频处理之裁剪(尺寸、时间)

第一步 、效果

先什么都不丢。先甩个视频让老铁们看下效果:


video810

第二步、思想

1.用的ffmpeg 命令:

public intdoCropResouce(String inputPath,intcropDimen,doublestartTime,doubleduring) {

startCutTime= System.currentTimeMillis();

File file =newFile(Constant.JIANLI_PATH_RESUME_RES);

//判断文件夹是否存在,如果不存在就创建,否则不创建

if(!file.exists()) {

//通过file的mkdirs()方法创建文件夹

file.mkdirs();

}

cutOutPath= Constant.JIANLI_PATH_RESUME_RES+ File.separator+FILE_NAME_CUT;

//滑动的距离换算到原来的视频上

intm = Math.abs(isVertical? (smooth*mVideoW/mScreenW) : (smooth*mVideoH/mScreenW));

String trimTime =" -ss "+ StringUtils.formatDoubleSecond(startTime) +" -t "+ StringUtils.formatDoubleSecond(during);

String filter = getFilter(cropDimen,mRoll,isLandRes? m :0,isLandRes?0: m);

StringBuilder sb =newStringBuilder("ffmpeg");

sb.append(" -threads 6");

//    sb.append(" -i");

//    sb.append(" " + inAudioPath); // 合音频

sb.append(" -i");

sb.append(" "+ inputPath);

sb.append(trimTime);//时间裁剪  //  "-vf \"transpose=1,crop=720:720:0:%d\"",

if(videoType.equals(DealVideo.TYPE_ALBUM)) {

sb.append(" -filter_complex");

sb.append(" "+ filter);//尺寸裁剪  上两都可以判断用户只操作一种的情况

}

sb.append(" -preset superfast -tune zerolatency");//加快效率

sb.append(" -b:v");

intrate = (int) (MediaRecorderBase.VIDEO_BITRATE_HIGH);

sb.append(" "+ rate +"k");

sb.append(" -r 20");

sb.append(" -keyint_min 20 -g 20 -sc_threshold 0");

sb.append(" -y");

sb.append(" "+cutOutPath);

//    Log.d("zhou", "doCropResouce: ===" + sb.toString());

inti = UtilityAdapter.FFmpegRun("", sb.toString());

returni;}

2 UI实现:

尺寸裁剪UI:本人项目需求是得到正方形的视频    也就是说如果资源视频是W1280*H720 则我们目标为720*720  。  在此之前还有一个判断就是我们源视频小边要缩放到屏幕宽度的尺寸 这时有个尺寸比例,按照这个比例同是对源视频的大边进同缩放。其次就是W>H 时 我的是源视频是横向视频。反之则是竖向视频。明白以上之后。接下来就是布局。

本人项目中用的播放器自定义的

JLXVideoView  extends TextureView  implementsTextureView.SurfaceTextureListener {} 这里值得提醒也是让本人头疼了一两天的坑  播放器不要用VideoView  因为是SurfaceView 的继承,上下平移时videoview 会直接滑到最上层。导致titlebar会消失。这点我也找到了理由。(有点复杂)所以不再术。不信的同鞋 ,可以去偿试一次。 之后就有两种方式让我们的播放器JLXVideoView平移:方法一,OnTouchListener   本人实现觉得比较好,也是传统的平控件平移处理的方案,但被公司测试提案滑动效果不太理想所以无奈寻求了方案二,但本人个人从技术上还是提倡方案1 。应该是比较正统的现实 。  方法二   我们将播放器用一个滚动的FrameLayout        mScrollview  定义为 FrameLayout  是因为我们不知道它的滚动方向  在实例化的时候 我们可以由视频的方向 

mScrollview=isVertical?newScrollView(this):newHorizontalScrollView(this);  在这里我们实例化的滚动控件的时候确定了滚动的方向。 这里其实制是投机了ScrollView 的一个滑动的特性。而且Build.VERSION_CODES >= API23。但好像<23也是没有问题。但尚不知有没有露洞。如果有人发现可以留言区留言一起探讨学习一下。   用方案二实现滑动效果应该是要好一点。但视觉效果本人觉得比方案一要差。(快滑到未端就有白边ScrollView的缓冲没有刹车住)

时间裁剪UI:  这是一个自定义的VIew    首先多线程去解析资源视频的视频帧。

//开启多线程   newThreadPoul(extractW, extractH,mUIHandler,PLAY_URL,OutPutFileDirPath, startPosition, endPosition, thumbnailsCount,new int[]{4,8}); 

onDraw方法实现全部UI


第三步、贴部分重要代码 

由于是公司项目实现目前又没有去做代码功能提取。在这里只上传核心代码,请谅解! 有时间会把整个功能代码提取上传。

参考代码



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容