第一步 、效果
先什么都不丟轩褐。先甩個視頻讓老鐵們看下效果:
第二步椎咧、思想
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()) {
//通過file的mkdirs()方法創(chuàng)建文件夾
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實現(xiàn):
尺寸裁剪UI:本人項目需求是得到正方形的視頻 ? ?也就是說如果資源視頻是W1280*H720 則我們目標(biāo)為720*720 ?。 ?在此之前還有一個判斷就是我們源視頻小邊要縮放到屏幕寬度的尺寸 這時有個尺寸比例蟋座,按照這個比例同是對源視頻的大邊進同縮放拗踢。其次就是W>H 時 我的是源視頻是橫向視頻。反之則是豎向視頻向臀。明白以上之后巢墅。接下來就是布局。
本人項目中用的播放器自定義的
JLXVideoView? extends TextureView? implementsTextureView.SurfaceTextureListener {} 這里值得提醒也是讓本人頭疼了一兩天的坑? 播放器不要用VideoView? 因為是SurfaceView 的繼承券膀,上下平移時videoview 會直接滑到最上層君纫。導(dǎo)致titlebar會消失。這點我也找到了理由芹彬。(有點復(fù)雜)所以不再術(shù)蓄髓。不信的同鞋 ,可以去償試一次舒帮。 之后就有兩種方式讓我們的播放器JLXVideoView平移:方法一会喝,OnTouchListener ? 本人實現(xiàn)覺得比較好,也是傳統(tǒng)的平控件平移處理的方案玩郊,但被公司測試提案滑動效果不太理想所以無奈尋求了方案二肢执,但本人個人從技術(shù)上還是提倡方案1 。應(yīng)該是比較正統(tǒng)的現(xiàn)實 译红。 ?方法二 ? 我們將播放器用一個滾動的FrameLayout? ? ? ? mScrollview? 定義為 FrameLayout? 是因為我們不知道它的滾動方向? 在實例化的時候 我們可以由視頻的方向?
mScrollview=isVertical?newScrollView(this):newHorizontalScrollView(this);? 在這里我們實例化的滾動控件的時候確定了滾動的方向预茄。 這里其實制是投機了ScrollView 的一個滑動的特性。而且Build.VERSION_CODES >= API23临庇。但好像<23也是沒有問題反璃。但尚不知有沒有露洞。如果有人發(fā)現(xiàn)可以留言區(qū)留言一起探討學(xué)習(xí)一下假夺。 ? 用方案二實現(xiàn)滑動效果應(yīng)該是要好一點淮蜈。但視覺效果本人覺得比方案一要差。(快滑到未端就有白邊ScrollView的緩沖沒有剎車滓丫怼)
時間裁剪UI: ?這是一個自定義的VIew ? ?首先多線程去解析資源視頻的視頻幀梧田。
//開啟多線程 ??newThreadPoul(extractW, extractH,mUIHandler,PLAY_URL,OutPutFileDirPath, startPosition, endPosition, thumbnailsCount,new int[]{4,8});?
onDraw方法實現(xiàn)全部UI
第三步、貼部分重要代碼?
由于是公司項目實現(xiàn)目前又沒有去做代碼功能提取侧蘸。在這里只上傳核心代碼裁眯,請諒解! 有時間會把整個功能代碼提取上傳讳癌。