Android錄屏+視訊轉Gif實現

jerry-wang-1154193-unsplash.jpg
錄屏轉動圖
最近看見一個視訊轉GIF的開源專案: ofollow,noindex">ffmpeg-commands-executor-library ,有時會有手機錄屏轉成GIF動圖的需求,都是下載一個錄屏軟體錄屏,再下一個轉換軟體,一般是電腦上的軟體或者線上轉換,效果也不怎麼好,就想借這個東西來做一個錄屏轉GIF合一的APP
Android錄屏
Android 5.0+ 可以利用MediaProject 在非 root 情況下實現螢幕錄製,具體過程就是開啟錄屏服務,設定SurfaceView/">SurfaceView去接收內容,獲取視訊流,然後通過MediaCodec來實現視訊的硬編碼,然後儲存為視訊檔案
LGJing/ScreenRecorder" target="_blank" rel="nofollow,noindex">Android 5.0+ 螢幕錄製 :介紹瞭如何進行螢幕錄製還有具體的demo
Android截圖、錄屏工具:可以快速依賴,整合錄屏功能
FFmpeg的使用
1.FFmpeg視訊轉GIF命令,我感覺應該這應該是是最全的命令了,時間單位為s,會根據寬度值自適應高度
String command = "ffmpeg -i " + pathFrom + " -ss " + 跳過開頭時間 + " -t " + 轉換的時間 + " -vf scale=" + gif寬度 + ":-1 -r " + gif幀率 + " " + pathTo; //ffmpeg-commands-executor-library中的方法
2.使用ffmpeg-commands-executor-library中的方法來執行命令
FFmpegNativeHelper.runCommand(command);
這樣的確可以轉化成功,但是有一個bug,就是每次開啟APP只能轉換一次,第二次會失敗,看得出來作者已經沒有維護了,這樣其實也沒什麼問題,每次轉換重新開啟APP就好了,非常簡單,而且還有其他ffmpeg的功能也可以用。
編譯FFmpeg庫
ffmpeg這麼強大的一個開源庫,現在程式有這麼大一個bug存在,那肯定是不能忍受的,可以自己去下載ffmpeg原始碼然後編譯出在Android上面可以執行的庫。涉及到JNI和NDk,但其實一點都不難,我之前也沒有接觸過,不過看了幾篇教程踩了不少坑也成功了。
在Android中整合FFmpeg :我編譯的庫,可以快速依賴,整合FFmpeg,也有原始碼
網上文章很多,但是真的有各種問題,我試了不少,下面兩篇文章完全照著做其實也是不行的,但是改改還是可以搞定。
注意問題
- 下載版本相同的原始碼(3.3)
- 文章裡面教的複製的ffmpeg的原始碼有點小問題,找不到的就先不要管;
- 在Android裡面報錯找不到c++的類,我們要根據找不到的類的名字去FFmpeg裡面去找,然後新增進去;
- 然後c++中有些明明同一個包下的類找不到,因為在同一個資料夾下面的類其實不用匯入,原c++檔案匯入時候添加了當前包名導致路徑出錯,可以直接刪除匯入的程式碼(就是import*什麼的刪除掉就好了)
- 其實到了文章最後,也講了之前那個二次呼叫失敗的問題,並且給出瞭解決方案:
FFmpeg每次執行完命令後會呼叫 ffmpeg_cleanup 函式清理記憶體,並且會呼叫exit(0)結束當前程序,但是經過我們的修改,exit()的程式碼已經被刪掉,而我們的App還在執行,不能殺死程序,所以有些變數的值還在記憶體中,這樣就會導致下次執行的時候可能會出錯。 開啟ffmpeg.c找到剛修改的run函式,然後在 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;
完美方案
但是這個方法只解決了函式清理的問題,這樣去執行命名,還是有問題程式完成後直接退出了,原因很簡單,其實就是c++完成後呼叫了下面這個函式,是結束當前程序,這個東西還是沒有改好
int exit_program(int ret) { if (program_exit) program_exit(ret); return ret; }
只需要改成這樣就好了:
int exit_program(int ret) { return ret; }
參考了這篇文章後面的坑點修改:
http://www.jianshu.com/p/ceaa286d8affAndroid錄屏參考連結:
https://github.com/GLGJing/ScreenRecorder專案原始碼: https://github.com/tyhjh/FFmpeg
最後我的APP連線: http://lc-fgtnb2h8.cn-n1.lcfile.com/eb77c867e490eba1d9ba.apk
支援錄屏後轉gif,支援攝像後轉gif,支援本地視訊轉gif以及各種引數設定(側邊欄選單中設定)