錄屏轉(zhuǎn)動圖
最近看見一個視頻轉(zhuǎn)GIF的開源項目:ffmpeg-commands-executor-library挽荠,有時會有手機錄屏轉(zhuǎn)成GIF動圖的需求,都是下載一個錄屏軟件錄屏圈匆,再下一個轉(zhuǎn)換軟件,一般是電腦上的軟件或者在線轉(zhuǎn)換捏雌,效果也不怎么好跃赚,就想借這個東西來做一個錄屏轉(zhuǎn)GIF合一的APP
Android錄屏
Android 5.0+ 可以利用MediaProject 在非 root 情況下實現(xiàn)屏幕錄制,具體過程就是開啟錄屏服務(wù)纬傲,設(shè)置SurfaceView去接收內(nèi)容,獲取視頻流叹括,然后通過MediaCodec來實現(xiàn)視頻的硬編碼算墨,然后保存為視頻文件
Android 5.0+ 屏幕錄制:介紹了如何進行屏幕錄制還有具體的demo
Android截屏、錄屏工具:可以快速依賴汁雷,集成錄屏功能
FFmpeg的使用
1.FFmpeg視頻轉(zhuǎn)GIF命令净嘀,我感覺應(yīng)該這應(yīng)該是是最全的命令了,時間單位為s挖藏,會根據(jù)寬度值自適應(yīng)高度
String command = "ffmpeg -i " + pathFrom + " -ss " + 跳過開頭時間 + " -t " + 轉(zhuǎn)換的時間 + " -vf scale=" + gif寬度 + ":-1 -r " + gif幀率 + " " + pathTo;
//ffmpeg-commands-executor-library中的方法
2.使用ffmpeg-commands-executor-library中的方法來執(zhí)行命令
FFmpegNativeHelper.runCommand(command);
這樣的確可以轉(zhuǎn)化成功厢漩,但是有一個bug,就是每次打開APP只能轉(zhuǎn)換一次溜嗜,第二次會失敗,看得出來作者已經(jīng)沒有維護了炸宵,這樣其實也沒什么問題,每次轉(zhuǎn)換重新打開APP就好了焙压,非常簡單抑钟,而且還有其他ffmpeg的功能也可以用。
編譯FFmpeg庫
ffmpeg這么強大的一個開源庫在塔,現(xiàn)在程序有這么大一個bug存在,那肯定是不能忍受的绰沥,可以自己去下載ffmpeg源碼然后編譯出在Android上面可以運行的庫。涉及到JNI和NDk徽曲,但其實一點都不難麸塞,我之前也沒有接觸過秃臣,不過看了幾篇教程踩了不少坑也成功了。
在Android中集成FFmpeg:我編譯的庫弧哎,可以快速依賴稚虎,集成FFmpeg,也有源碼
網(wǎng)上文章很多蠢终,但是真的有各種問題序攘,我試了不少,下面兩篇文章完全照著做其實也是不行的蜕径,但是改改還是可以搞定。
在Mac下編譯 FFmpeg 兜喻,并在Android中使用:
在Android 中使用FFmpeg命令
注意問題
- 下載版本相同的源碼(3.3)
- 文章里面教的復(fù)制的ffmpeg的源碼有點小問題,找不到的就先不要管帕识;
- 在Android里面報錯找不到c++的類遂铡,我們要根據(jù)找不到的類的名字去FFmpeg里面去找肮疗,然后添加進去扒接;
- 然后c++中有些明明同一個包下的類找不到,因為在同一個文件夾下面的類其實不用導(dǎo)入碱呼,原c++文件導(dǎo)入時候添加了當(dāng)前包名導(dǎo)致路徑出錯,可以直接刪除導(dǎo)入的代碼(就是import*什么的刪除掉就好了)
- 其實到了文章最后愚臀,也講了之前那個二次調(diào)用失敗的問題矾利,并且給出了解決方案:
FFmpeg每次執(zhí)行完命令后會調(diào)用 ffmpeg_cleanup 函數(shù)清理內(nèi)存,并且會調(diào)用exit(0)結(jié)束當(dāng)前進程男旗,但是經(jīng)過我們的修改,exit()的代碼已經(jīng)被刪掉捧毛,而我們的App還在運行,不能殺死進程呀忧,所以有些變量的值還在內(nèi)存中,這樣就會導(dǎo)致下次執(zhí)行的時候可能會出錯而账。
打開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;
完美方案
但是這個方法只解決了函數(shù)清理的問題笔横,這樣去運行命名咐吼,還是有問題程序完成后直接退出了,原因很簡單锯茄,其實就是c++完成后調(diào)用了下面這個函數(shù),是結(jié)束當(dāng)前進程肌幽,這個東西還是沒有改好
int exit_program(int ret)
{
if (program_exit)
program_exit(ret);
return ret;
}
只需要改成這樣就好了:
int exit_program(int ret)
{
return ret;
}
參考了這篇文章后面的坑點修改:
http://www.reibang.com/p/ceaa286d8aff
Android錄屏參考鏈接:
https://github.com/GLGJing/ScreenRecorder
ffmpeg命令參考鏈接:
使用 ffmpeg 實現(xiàn) MP4 與 GIF 的互轉(zhuǎn)
FFmpeg續(xù)篇:截取視頻片段轉(zhuǎn)成GIF動畫
在Android中集成FFmpeg
項目源碼:https://github.com/tyhjh/FFmpeg
最后我的APP連接:http://lc-fgtnb2h8.cn-n1.lcfile.com/eb77c867e490eba1d9ba.apk
支持錄屏后轉(zhuǎn)gif喂急,支持?jǐn)z像后轉(zhuǎn)gif,支持本地視頻轉(zhuǎn)gif以及各種參數(shù)設(shè)置(側(cè)邊欄菜單中設(shè)置)