动态贴纸(互动道具) - Arcloud/LiveRecorder-Android GitHub Wiki
动态贴纸需要启用人脸检测功能,人脸检测功能及贴纸需要用到资源文件,app需要将资源文件拷贝到程序中。包括如下步骤:
1.将人脸检测追踪数据存放文件拷贝到设备上:
/**
* 将track_data.dat文件从assets中拷贝到指定路径
* 以便程序运行过程中能够访问
*/
private void createFaceTrackFile() {
try {
String strINIFile = null;
String _strFileDir = mContext.getFilesDir().getAbsolutePath();
if (!_strFileDir.endsWith("/"))
_strFileDir = _strFileDir + "/";
File dirFile = new File(_strFileDir);
Log.i(TAG, "createFaceTrackFile in, _strFileDir " + _strFileDir);
if (!dirFile.exists()) {
if (!dirFile.mkdirs()) {
return;
}
}
strINIFile = "track_data.dat";
InputStream is = mContext.getAssets().open(strINIFile);
File file = new File(_strFileDir + strINIFile);
if(file.exists()){
file.delete();
}
if (!file.exists()) {
byte[] buf = new byte[1024];
file.createNewFile();
FileOutputStream os = new FileOutputStream(file);
while (true) {
int ins = is.read(buf);
if (ins > 0) {
os.write(buf, 0, ins);
} else {
is.close();
os.flush();
os.close();
break;
}
}
}
mFaceTrackDataPath = _strFileDir + strINIFile;
} catch (Exception e) {
e.printStackTrace();
}
}
2.将动态贴纸资源文件解压并拷贝到设备上;
/**
* 将动态贴纸资源(paopao.zip)文件从assets中拷贝到指定路径
* 以便程序运行过程中能够访问
*/
private void restore2DStickData(){
String stickerPath = "/sdcard/arcsoftspotlight/paopao" ;
try {
//将zip解压到指定路径
UnzipFromAssets.unZip(mContext, "paopao.zip", stickerPath.substring(0,stickerPath.lastIndexOf("/")), true);
m2DStickerResDataPath = stickerPath;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3.打开人脸检测功能:
enableFaceContour(enabled, mFaceTrackDataPath);
4.添加互动道具Filter
getFiltersController().addFilter(ArcGPUFilterTypes.ARC_GPUIMG_FILTER_2DSTICKER)
5.设置互动道具资源文件存放路径
getFiltersController().set2DStickerResPath(m2DStickerResDataPath)
6.zip解压的方法可以自己写,也可参考如下代码:
/**
* 解压assets的zip压缩文件到指定目录
*
* @param context上下文对象
* @param assetName压缩文件名
* @param outputDirectory输出目录
* @param isReWrite是否覆盖
* @throws IOException
*/
public static void unZip(Context context, String assetName, String outputDirectory, boolean isReWrite)
throws IOException {
// 创建解压目标目录
File file = new File(outputDirectory);
// 如果目标目录不存在,则创建
if (!file.exists()) {
file.mkdirs();
}
// 打开压缩文件
InputStream inputStream = context.getAssets().open(assetName);
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
// 读取一个进入点
ZipEntry zipEntry = zipInputStream.getNextEntry();
// 使用1Mbuffer
byte[] buffer = new byte[1024 * 1024];
// 解压时字节计数
int count = 0;
// 如果进入点为空说明已经遍历完所有压缩包中文件和目录
while (zipEntry != null) {
// 如果是一个目录
if (zipEntry.isDirectory()) {
file = new File(outputDirectory + File.separator + zipEntry.getName());
// 文件需要覆盖或者是文件不存在
if (isReWrite || !file.exists()) {
file.mkdir();
}
} else {
// 如果是文件
file = new File(outputDirectory + File.separator + zipEntry.getName());
// 文件需要覆盖或者文件不存在,则解压文件
if (isReWrite || !file.exists()) {
file.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(file);
while ((count = zipInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, count);
}
fileOutputStream.close();
}
}
// 定位到下一个文件入口
zipEntry = zipInputStream.getNextEntry();
}
zipInputStream.close();
}