視頻處理之裁剪(尺寸、時間)

第一步 、效果

先什么都不丟。先甩個視頻讓老鐵們看下效果:


video810

第二步、思想

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 則我們目標為720*720 ?。 ?在此之前還有一個判斷就是我們源視頻小邊要縮放到屏幕寬度的尺寸 這時有個尺寸比例,按照這個比例同是對源視頻的大邊進同縮放。其次就是W>H 時 我的是源視頻是橫向視頻。反之則是豎向視頻。明白以上之后。接下來就是布局。

本人項目中用的播放器自定義的

JLXVideoView? extends TextureView? implementsTextureView.SurfaceTextureListener {} 這里值得提醒也是讓本人頭疼了一兩天的坑? 播放器不要用VideoView? 因為是SurfaceView 的繼承,上下平移時videoview 會直接滑到最上層。導致titlebar會消失。這點我也找到了理由。(有點復雜)所以不再術。不信的同鞋 ,可以去償試一次。 之后就有兩種方式讓我們的播放器JLXVideoView平移:方法一,OnTouchListener ? 本人實現(xiàn)覺得比較好,也是傳統(tǒng)的平控件平移處理的方案,但被公司測試提案滑動效果不太理想所以無奈尋求了方案二,但本人個人從技術上還是提倡方案1 。應該是比較正統(tǒng)的現(xiàn)實 。 ?方法二 ? 我們將播放器用一個滾動的FrameLayout? ? ? ? mScrollview? 定義為 FrameLayout? 是因為我們不知道它的滾動方向? 在實例化的時候 我們可以由視頻的方向?

mScrollview=isVertical?newScrollView(this):newHorizontalScrollView(this);? 在這里我們實例化的滾動控件的時候確定了滾動的方向。 這里其實制是投機了ScrollView 的一個滑動的特性。而且Build.VERSION_CODES >= API23。但好像<23也是沒有問題。但尚不知有沒有露洞。如果有人發(fā)現(xiàn)可以留言區(qū)留言一起探討學習一下。 ? 用方案二實現(xiàn)滑動效果應該是要好一點。但視覺效果本人覺得比方案一要差。(快滑到未端就有白邊ScrollView的緩沖沒有剎車住)

時間裁剪UI: ?這是一個自定義的VIew ? ?首先多線程去解析資源視頻的視頻幀。

//開啟多線程 ??newThreadPoul(extractW, extractH,mUIHandler,PLAY_URL,OutPutFileDirPath, startPosition, endPosition, thumbnailsCount,new int[]{4,8});?

onDraw方法實現(xiàn)全部UI


第三步、貼部分重要代碼?

由于是公司項目實現(xiàn)目前又沒有去做代碼功能提取。在這里只上傳核心代碼,請諒解! 有時間會把整個功能代碼提取上傳。

參考代碼



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容