第一步 、效果
先什么都不丟。先甩個(gè)視頻讓老鐵們看下效果:
第二步、思想
1.用的ffmpeg 命令:
public intdoCropResouce(String inputPath,intcropDimen,doublestartTime,doubleduring) {
startCutTime= System.currentTimeMillis();
File file =newFile(Constant.JIANLI_PATH_RESUME_RES);
//判斷文件夾是否存在,如果不存在就創(chuàng)建,否則不創(chuàng)建
if(!file.exists()) {
//通過(guò)file的mkdirs()方法創(chuàng)建文件夾
file.mkdirs();
}
cutOutPath= Constant.JIANLI_PATH_RESUME_RES+ File.separator+FILE_NAME_CUT;
//滑動(dòng)的距離換算到原來(lái)的視頻上
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);//時(shí)間裁剪? //? "-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實(shí)現(xiàn):
尺寸裁剪UI:本人項(xiàng)目需求是得到正方形的視頻 ? ?也就是說(shuō)如果資源視頻是W1280*H720 則我們目標(biāo)為720*720 ?。 ?在此之前還有一個(gè)判斷就是我們?cè)匆曨l小邊要縮放到屏幕寬度的尺寸 這時(shí)有個(gè)尺寸比例,按照這個(gè)比例同是對(duì)源視頻的大邊進(jìn)同縮放。其次就是W>H 時(shí) 我的是源視頻是橫向視頻。反之則是豎向視頻。明白以上之后。接下來(lái)就是布局。
本人項(xiàng)目中用的播放器自定義的
JLXVideoView? extends TextureView? implementsTextureView.SurfaceTextureListener {} 這里值得提醒也是讓本人頭疼了一兩天的坑? 播放器不要用VideoView? 因?yàn)槭荢urfaceView 的繼承,上下平移時(shí)videoview 會(huì)直接滑到最上層。導(dǎo)致titlebar會(huì)消失。這點(diǎn)我也找到了理由。(有點(diǎn)復(fù)雜)所以不再術(shù)。不信的同鞋 ,可以去償試一次。 之后就有兩種方式讓我們的播放器JLXVideoView平移:方法一,OnTouchListener ? 本人實(shí)現(xiàn)覺(jué)得比較好,也是傳統(tǒng)的平控件平移處理的方案,但被公司測(cè)試提案滑動(dòng)效果不太理想所以無(wú)奈尋求了方案二,但本人個(gè)人從技術(shù)上還是提倡方案1 。應(yīng)該是比較正統(tǒng)的現(xiàn)實(shí) 。 ?方法二 ? 我們將播放器用一個(gè)滾動(dòng)的FrameLayout? ? ? ? mScrollview? 定義為 FrameLayout? 是因?yàn)槲覀儾恢浪臐L動(dòng)方向? 在實(shí)例化的時(shí)候 我們可以由視頻的方向?
mScrollview=isVertical?newScrollView(this):newHorizontalScrollView(this);? 在這里我們實(shí)例化的滾動(dòng)控件的時(shí)候確定了滾動(dòng)的方向。 這里其實(shí)制是投機(jī)了ScrollView 的一個(gè)滑動(dòng)的特性。而且Build.VERSION_CODES >= API23。但好像<23也是沒(méi)有問(wèn)題。但尚不知有沒(méi)有露洞。如果有人發(fā)現(xiàn)可以留言區(qū)留言一起探討學(xué)習(xí)一下。 ? 用方案二實(shí)現(xiàn)滑動(dòng)效果應(yīng)該是要好一點(diǎn)。但視覺(jué)效果本人覺(jué)得比方案一要差。(快滑到未端就有白邊ScrollView的緩沖沒(méi)有剎車?。?/p>
時(shí)間裁剪UI: ?這是一個(gè)自定義的VIew ? ?首先多線程去解析資源視頻的視頻幀。
//開啟多線程 ??newThreadPoul(extractW, extractH,mUIHandler,PLAY_URL,OutPutFileDirPath, startPosition, endPosition, thumbnailsCount,new int[]{4,8});?
onDraw方法實(shí)現(xiàn)全部UI
第三步、貼部分重要代碼?
由于是公司項(xiàng)目實(shí)現(xiàn)目前又沒(méi)有去做代碼功能提取。在這里只上傳核心代碼,請(qǐng)諒解! 有時(shí)間會(huì)把整個(gè)功能代碼提取上傳。