动态贴纸(互动道具) - 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();
}