android 录屏自动运行,Android录屏+视频转Gif实现
jerry-wang-1154193-unsplash.jpg
錄屏轉(zhuǎn)動(dòng)圖
最近看見一個(gè)視頻轉(zhuǎn)GIF的開源項(xiàng)目:ffmpeg-commands-executor-library,有時(shí)會(huì)有手機(jī)錄屏轉(zhuǎn)成GIF動(dòng)圖的需求,都是下載一個(gè)錄屏軟件錄屏,再下一個(gè)轉(zhuǎn)換軟件,一般是電腦上的軟件或者在線轉(zhuǎn)換,效果也不怎么好,就想借這個(gè)東西來做一個(gè)錄屏轉(zhuǎn)GIF合一的APP
Android錄屏
Android 5.0+ 可以利用MediaProject 在非 root 情況下實(shí)現(xiàn)屏幕錄制,具體過程就是開啟錄屏服務(wù),設(shè)置SurfaceView去接收內(nèi)容,獲取視頻流,然后通過MediaCodec來實(shí)現(xiàn)視頻的硬編碼,然后保存為視頻文件
Android 5.0+ 屏幕錄制:介紹了如何進(jìn)行屏幕錄制還有具體的demo
Android截屏、錄屏工具:可以快速依賴,集成錄屏功能
FFmpeg的使用
1.FFmpeg視頻轉(zhuǎn)GIF命令,我感覺應(yīng)該這應(yīng)該是是最全的命令了,時(shí)間單位為s,會(huì)根據(jù)寬度值自適應(yīng)高度
String command = "ffmpeg -i " + pathFrom + " -ss " + 跳過開頭時(shí)間 + " -t " + 轉(zhuǎn)換的時(shí)間 + " -vf scale=" + gif寬度 + ":-1 -r " + gif幀率 + " " + pathTo;
//ffmpeg-commands-executor-library中的方法
2.使用ffmpeg-commands-executor-library中的方法來執(zhí)行命令
FFmpegNativeHelper.runCommand(command);
這樣的確可以轉(zhuǎn)化成功,但是有一個(gè)bug,就是每次打開APP只能轉(zhuǎn)換一次,第二次會(huì)失敗,看得出來作者已經(jīng)沒有維護(hù)了,這樣其實(shí)也沒什么問題,每次轉(zhuǎn)換重新打開APP就好了,非常簡單,而且還有其他ffmpeg的功能也可以用。
編譯FFmpeg庫
ffmpeg這么強(qiáng)大的一個(gè)開源庫,現(xiàn)在程序有這么大一個(gè)bug存在,那肯定是不能忍受的,可以自己去下載ffmpeg源碼然后編譯出在Android上面可以運(yùn)行的庫。涉及到JNI和NDk,但其實(shí)一點(diǎn)都不難,我之前也沒有接觸過,不過看了幾篇教程踩了不少坑也成功了。
在Android中集成FFmpeg:我編譯的庫,可以快速依賴,集成FFmpeg,也有源碼
網(wǎng)上文章很多,但是真的有各種問題,我試了不少,下面兩篇文章完全照著做其實(shí)也是不行的,但是改改還是可以搞定。
注意問題
文章里面教的復(fù)制的ffmpeg的源碼有點(diǎn)小問題,找不到的就先不要管;
在Android里面報(bào)錯(cuò)找不到c++的類,我們要根據(jù)找不到的類的名字去FFmpeg里面去找,然后添加進(jìn)去;
然后c++中有些明明同一個(gè)包下的類找不到,因?yàn)樵谕粋€(gè)文件夾下面的類其實(shí)不用導(dǎo)入,原c++文件導(dǎo)入時(shí)候添加了當(dāng)前包名導(dǎo)致路徑出錯(cuò),可以直接刪除導(dǎo)入的代碼(就是import*什么的刪除掉就好了)
其實(shí)到了文章最后,也講了之前那個(gè)二次調(diào)用失敗的問題,并且給出了解決方案:
FFmpeg每次執(zhí)行完命令后會(huì)調(diào)用 ffmpeg_cleanup 函數(shù)清理內(nèi)存,并且會(huì)調(diào)用exit(0)結(jié)束當(dāng)前進(jìn)程,但是經(jīng)過我們的修改,exit()的代碼已經(jīng)被刪掉,而我們的App還在運(yùn)行,不能殺死進(jìn)程,所以有些變量的值還在內(nèi)存中,這樣就會(huì)導(dǎo)致下次執(zhí)行的時(shí)候可能會(huì)出錯(cuò)。
打開ffmpeg.c找到剛修改的run函數(shù),然后在 return 前加上如下代碼即可:
nb_filtergraphs = 0;
progress_avio = NULL;
input_streams = NULL;
nb_input_streams = 0;
input_files = NULL;
nb_input_files = 0;
output_streams = NULL;
nb_output_streams = 0;
output_files = NULL;
nb_output_files = 0;
完美方案
但是這個(gè)方法只解決了函數(shù)清理的問題,這樣去運(yùn)行命名,還是有問題程序完成后直接退出了,原因很簡單,其實(shí)就是c++完成后調(diào)用了下面這個(gè)函數(shù),是結(jié)束當(dāng)前進(jìn)程,這個(gè)東西還是沒有改好
int exit_program(int ret)
{
if (program_exit)
program_exit(ret);
return ret;
}
只需要改成這樣就好了:
int exit_program(int ret)
{
return ret;
}
支持錄屏后轉(zhuǎn)gif,支持?jǐn)z像后轉(zhuǎn)gif,支持本地視頻轉(zhuǎn)gif以及各種參數(shù)設(shè)置(側(cè)邊欄菜單中設(shè)置)
總結(jié)
以上是生活随笔為你收集整理的android 录屏自动运行,Android录屏+视频转Gif实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电大有计算机教程吗,电大教程 计算机概述
- 下一篇: android sina oauth2.