關(guān)于安卓視頻加水印與剪輯功能實(shí)現(xiàn)

內(nèi)容如題顷蟆,文末有demo

核心功能使用rxffmpeg實(shí)現(xiàn)
感謝開源sdk-rxffmpeg

今日帐偎,公司有個需求,就是對視頻實(shí)現(xiàn)剪輯豁生,和加水印漫贞。先上圖:

視頻加水印效果

加水印

視頻剪輯

剪輯

使用方法

VideoEditFun.getInstance().init(this)
        VideoEditFun.getInstance().setOnPicCallback(object : VideoEditFunPicCallback {
            override fun loadImage(path: String?, view: ImageView?) {
                ImageManager.getInstance().loadNormalPic(path, view)
            }

            override fun loadImage(resId: Int, view: ImageView?) {
                ImageManager.getInstance().loadLocalPic(resId, view)
            }
        })
        VideoEditFun.getInstance().setOnFunCallback(object : VideoEditFunCallback {
            override fun addTxt(path: String?) {
                KtLogUtil.d("視頻信息addTxt:${path}")
            }

            override fun error(message: String?) {
                KtLogUtil.d("視頻信息error:${message}")
            }

            override fun cropPath(path: String?) {
                KtLogUtil.d("視頻信息cropPath:${path}")
            }
        })
        val path = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/share_d4d8c1b6646faa1527eac44c252dd121.mp4"
//        val path = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/VID_20220321_213020.mp4"
//        val path = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/VID_20220322_172210.mp4"
//        val path = Environment.getExternalStorageDirectory().getPath() +
//                "/Screenrecorder-2022-03-03-14-43-16-450.mp4"
        VideoEditFun.getInstance().cropVideo(this, path)
//        VideoEditFun.getInstance().addText(this, path)

實(shí)現(xiàn)講解

視頻剪輯:

怎樣獲取剪裁位置芍殖?

首先腦海里面應(yīng)該有個思路豌骏,我視頻的長度,換算為什么東西窃躲,才能進(jìn)行等比例的剪裁,就是這個剪裁的范圍值躁倒,是怎樣算出來的樱溉?

這里纬凤,我的實(shí)現(xiàn)思路,就是把視頻剪裁的范圍挖帘,換算為屏幕的寬度恋技。

設(shè)想一下?

視頻假如10s骄崩,換算為一個1080px的寬度的分辨率薄辅。那么,就能得出一個px對應(yīng)多少s視頻長度了吧脱惰。

說到這里

應(yīng)該突然懂了吧窿春,那就直接劃到底部吧
看不懂就繼續(xù)蔚润。

怎樣實(shí)現(xiàn)尺栖?

首先,視頻剪裁本質(zhì)上货徙,是有一個層疊的滑動選擇控件皮胡,一個是視頻長度可以滑動(如果超過范圍),再一個蠢棱,是視頻的范圍選擇控件可以滑動甩栈。

對于第一個,我們使用recyclerview實(shí)現(xiàn)即可玉转,設(shè)定每個item的固定長度究抓,通過layoutmanager獲取首尾可以item袭灯,計算出視頻可見范圍。

對于第二個橘茉,使用一個可拖動的自定義view姨丈,基于第一個可見范圍的基礎(chǔ)上,再進(jìn)行范圍的選取构挤。

最終我們的范圍取值,是基于第二個控件的唐础,第一個控件提供了視頻原始范圍矾飞,第二個控件提供了我們的剪裁范圍。

最后豹绪,有了剪裁范圍,就別扯這么多了瞒津,直接調(diào)用ffmpeg進(jìn)行剪裁。

說到這里巷蚪,不懂的話屁柏,直接滑動到底部,下載demo自己看淌喻。

視頻加水印:

首先八拱,加水印烁落,我這里選擇的方法是在視頻上,覆蓋上一個圖片灯萍。

什么?圖片旦棉?是不是明白了什么绑洛?

沒錯童本,核心就是一個控件的圖片獲取,核心代碼如下:

    public static void viewSnapshot(View view, ViewSnapListener listener) {
        //使控件可以進(jìn)行緩存
        view.setDrawingCacheEnabled(true);
        //獲取緩存的 Bitmap
        Bitmap drawingCache = view.getDrawingCache();
        //復(fù)制獲取的 Bitmap
        drawingCache = Bitmap.createBitmap(drawingCache);
        //關(guān)閉視圖的緩存
        view.setDrawingCacheEnabled(false);
        if (drawingCache != null) {
            if (listener != null) {
                listener.success(drawingCache);
            }
        } else {
            if (listener != null) {
                listener.failed();
            }
        }
    }

說重點(diǎn)绑蔫,怎樣加個文字在這個控件上面泵额,又怎樣實(shí)現(xiàn)文字的顏色,文字的拖動篓叶。

那就自定義一個文字控件,可以改變顏色左敌,實(shí)現(xiàn)拖動嗦董,放大縮小的那種。

沒錯,bitmap是操作核心幸斥,那你懂了吧

顏色

這個不用講了吧,原生屬性

拖動

GestureDetector實(shí)現(xiàn)坐標(biāo)獲取廊勃,然后控件進(jìn)行位置

放大縮小

就是對控件的拖動操作经窖,判斷是放大還是縮小,然后進(jìn)行繪制

然后獲取到一個view的bitmap冰悠,然后合成圖片配乱,然后合成視頻。

注意桑寨,圖片寬高和視頻寬高要等比縮放忿檩,不然合成會有拉伸。

獲取視頻寬高的時候沙咏,也要注意旋轉(zhuǎn)角度的適配

說完了兽掰,是不是一臉懵?

最后附上demo

demo示例代碼

that's all----------------------------------------------------------------------------------------

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窖壕,一起剝皮案震驚了整個濱河市瞻讽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌速勇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件养匈,死亡現(xiàn)場離奇詭異都伪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)猬仁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門湿刽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褐耳,“玉大人,你說我怎么就攤上這事买雾⊙蠲保” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵晃危,是天一觀的道長僚饭。 經(jīng)常有香客問我胧砰,道長,這世上最難降的妖魔是什么偿乖? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮媳禁,結(jié)果婚禮上画切,老公的妹妹穿的比我還像新娘。我一直安慰自己毫别,他們只是感情好拧烦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布钝计。 她就那樣靜靜地躺著私恬,像睡著了一般炼吴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荣德,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天涮瞻,我揣著相機(jī)與錄音,去河邊找鬼署咽。 笑死生音,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惰聂。 我是一名探鬼主播蓉媳,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼督怜,長吁一口氣:“原來是場噩夢啊……” “哼号杠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姨蟋,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤眼溶,失蹤者是張志新(化名)和其女友劉穎晓勇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绰筛,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铝噩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了窿克。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骏庸。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖年叮,靈堂內(nèi)的尸體忽然破棺而出具被,到底是詐尸還是另有隱情,我是刑警寧澤谋右,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布硬猫,位于F島的核電站,受9級特大地震影響改执,放射性物質(zhì)發(fā)生泄漏啸蜜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一辈挂、第九天 我趴在偏房一處隱蔽的房頂上張望衬横。 院中可真熱鬧,春花似錦蜂林、人聲如沸噪叙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臭杰。三九已至寥枝,卻和暖如春脉顿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敢辩。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工怠苔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迫肖,地道東北人蟆湖。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像结窘,于是被迫代替她去往敵國和親隧枫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容