安卓AMR录音文件音量放大

public class AmrUtil {
	private static final int amrEncodeMode[] = { 4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200 }; // amr 编码方式
	private static final int AMR_FRAME_COUNT_PER_SECOND = 50;
	private static int mMode = 0;

	public static void change(String inPath, String outPath) {
		File inFile = new File(inPath);
		File outFile = new File(outPath);
		if (!inFile.exists()) {
			return;
		}
		try {
			outFile.deleteOnExit();
			outFile.createNewFile();

			FileInputStream in = new FileInputStream(inFile);
			FileOutputStream out = new FileOutputStream(outFile);

			byte[] amrhead = new byte[6];// amr head 6 bytes

			in.read(amrhead);
			out.write(amrhead);

			byte[] amrframehead = new byte[1];// amr frame head 1 bytes
			in.read(amrframehead);
			out.write(amrframehead);

			int frameSize = caclAMRFrameSize(amrframehead[0]);
			byte[] amrframecontent = new byte[frameSize - 1];// amr frame content frameSize - 1 bytes
			in.read(amrframecontent);
			out.write(amrframecontent);

			byte[] amrframe = new byte[frameSize];// amr frame frameSize bytes
			short[] pcmframe = new short[160];// pcm frame 160 shorts

			long state = AmrDecoder.init();
			AmrEncoder.init(0);

			while (in.read(amrframe) != -1) {
				AmrDecoder.decode(state, amrframe, pcmframe);
				int pcmval;
				for (int i = 0; i < pcmframe.length; i++) {
					// 音量调节
					pcmval = pcmframe[i] * 3;
					if (pcmval < 32767 && pcmval > -32768) {
						pcmframe[i] = (short) pcmval;
					} else if (pcmval > 32767) {
						pcmframe[i] = 32767;
					} else if (pcmval < -32768) { pcmframe[i] = -32768; } } AmrEncoder.encode(mMode, pcmframe, amrframe); out.write(amrframe); } in.close(); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } // 根据帧头计算当前帧大小 private static int caclAMRFrameSize(byte frameHeader) { int mode; int temp1 = 0; int temp2 = 0; int frameSize; temp1 = frameHeader; // 编码方式编号 = 帧头的3-6位 temp1 &= 0x78; // 0111-1000 temp1 >>= 3;
		
		mMode = temp1;
		mode = amrEncodeMode[temp1];

		// 计算amr音频数据帧大小
		// 原理: amr 一帧对应20ms,那么一秒有50帧的音频数据
		temp2 = myround((double) (((double) mode / (double) AMR_FRAME_COUNT_PER_SECOND) / (double) 8));

		frameSize = myround((double) temp2 + 0.5);
		return frameSize;
	}

	private static int myround(double x) {
		return ((int) (x + 0.5));
	}
}

参考:
1.AMR文件格式分析
2.opencore-amr-android

CocosCreator 微信分享屏幕截图(IOS+安卓)完整解决方案!

微信分享图片,对缩略图的大小是有要求的,笔者被这个坑的很惨。笔者开发的游戏分辨率为1280*720,安卓缩略图大小为128*72,IOS缩略图大小为256*144.

笔者直接贴代码了,详细的注释代码里面都有的。

JS部分

cc.Class({

    properties: {
        _isCapturing: false, // 正在截图中标志
    },

    // 微信分享屏幕截图
    shareScreenshot: function () {
        // 网页端不支持
        if (cc.sys.isBrowser) {
            cc.log('网页端不支持微信分享~');
            return;
        }

        // 正在截图中判断
        if (this._isCapturing) {
            return;
        }
        this._isCapturing = true;

        // 截图文件判断
        var fileName = "shareScreenshot.jpg";
        var fullPath = jsb.fileUtils.getWritablePath() + fileName;
        if (jsb.fileUtils.isFileExist(fullPath)) {
            jsb.fileUtils.removeFile(fullPath);
        }

        // 截图并保存图片文件
        var size = cc.director.getWinSize(); // 获取视图大小
        var texture = new cc.RenderTexture(size.width, size.height); // 新建渲染纹理
        texture.setPosition(cc.p(size.width / 2, size.height / 2)); // 移动渲染纹理到视图中心
        texture.begin(); // 开始渲染
        cc.director.getRunningScene().visit(); // 访问当前场景
        texture.end(); // 渲染结束
        texture.saveToFile(fileName, cc.IMAGE_FORMAT_JPG); // 保存渲染纹理到图片文件

        // 延时50毫秒,检测截图文件是否存在
        // 重复10次这个过程,如果超过10次仍没检测到图片文件,截图失败(超时)
        var self = this;
        var tryTimes = 0;
        var fn = function () {
            if (jsb.fileUtils.isFileExist(fullPath)) {
                // 调用相应平台微信分享图片方法
                if (cc.sys.os === cc.sys.OS_ANDROID) {
                    jsb.reflection.callStaticMethod('org/cocos2dx/javascript/MyJsPlugin', 'shareIMG', '(Ljava/lang/String;)V', fullPath);
                } else if (cc.sys.os === cc.sys.OS_IOS) {
                    jsb.reflection.callStaticMethod('AppController', 'shareIMG:', fullPath);
                }
                self._isCapturing = false;
            } else {
                tryTimes++;
                if (tryTimes > 10) {
                    self._isCapturing = false;
                    cc.log('截图失败,超时~');
                    return;
                }
                setTimeout(fn, 50);
            }
        };
        setTimeout(fn, 50);
    },
});

安卓部分 继续阅读CocosCreator 微信分享屏幕截图(IOS+安卓)完整解决方案!

CocosCreator 打包安卓项目出现【dlopen failed: cannot locate symbol “rand” referenced by “libcocos2djs.so”】原因分析与解决方案!

首先,笔者使用的是最新的CocosCreator 1.5.1版本。开发环境是mac。

安装配置原生开发环境使用的是官网提供的教程

Cocos官网提供的安卓SDK包含三个版本的api,分别是10,20,22.

出现标题中的问题的原因是编译项目时选择了22的api。

解决方案很简单,编译项目时选择10的api就好了。

还有一个最简单的方法,CocosCreator 1.5.1版本已经提供了预编译库文件,选择模板的时候,选择binary就可以直接使用已经编译好的库文件了,这样速度会提高很多。

不过切换api的时候,别忘了把以前编译的东西删除掉。如果不知道删除啥,直接把当前项目下的build文件夹删除掉就可以了,这个是默认的发布路径。如果已经进行了安卓平台的开发的话,可以删除安卓项目目录下的obj文件夹。

PS:笔者特意测试了下,使用20版本的api也是可以编译成功的。不过这里的话,还是推荐使用10版本的api来进行编译。编译模板推荐使用binary,也就是使用预编译库文件,毕竟修改源码什么的,应该很少才对吧。如果想修改安卓api版本的话,可以先使用10版本的api编译出来,然后在安卓项目里面切换api版本,这样也不会有问题。

最后附上笔者打包发布的设置截图。

继续阅读CocosCreator 打包安卓项目出现【dlopen failed: cannot locate symbol “rand” referenced by “libcocos2djs.so”】原因分析与解决方案!

第一次

《我的妹妹才没有那么可爱》——入宅作,第一次追番,第一次知道二次元

《空陆》——第一次接触GALGAME,第一次接触国产GALGAME

《11eyes -罪与罚与赎的少女-》——第一次接触日本GALGAME,第一次接触R18游戏

Android多渠道打包工具–MoeApkTool(通过assets目录内文件来区分渠道)

该工具参考自:RyApkTool特在此表示感谢~

1.原理

已签名APK文件==>ShakaApktool解压APK文件==>添加MOE_CHANNEL文件到assets目录

==>ShakaApktool重新打包APK文件==>jarsigner签名

MOE_CHANNEL文件里的内容就是渠道信息

2.用法

将APK文件放入工具包文件夹

CD到文件夹所在目录:java -jar MoeApkTool.jar keyFile keyName keyPasswd

3.编辑渠道信息

编辑工具包文件夹下的info文件夹里的channel.txt文件,一行一个渠道号

4.在程序里使用

点我看如何在程序里获取渠道号

5.下载地址

点我下载工具包

点我下载源码

BKEngine学习笔记

1.常用全局变量

tf 临时全局变量
f 存档相关全局变量
sf 存档无关全局变量
global.xxx 不属于上面三个类型,不过类似于tf

补充一些TJS中的说明:

以 f. 开头的变量,为游戏变量。该类变量将随着进度存档被保存。这类变量用于和游戏进度相关的数据。

以 sf. 开头的是系统变量。该类变量将在系统存档中被自动保存,在正常且没有改动的情况下将一直保持。这类变量用于与系统设置及游戏全局变量相关的数据。

以 tf. 开头的是全局变量。该类变量不会被保存,一旦程序退出就将丢失,用于临时使用的数据。

以上这三类变量将在第一次使用时被自动声明。不需要单独的声明或者定义。

global 表示“全局”(global)这个对象。在所有的代码段之外声明的变量、类、不属于类的成员的函数等都可以通过这个对象来操作。

2.类继承

.类方法不支持重名

.构造子类时,会强制调用父类的构造方法,不可以手动调用

在创建对象时,推荐使用Create方法来创建对象。

详细例子:

##
class A{
    function Create(a){
        log("A:"+a);
        return this;
    }
}
class B extends A{
    function Create(a,b){
        super.Create(b);
        log("B:"+a+"_"+b)
        return this;
    }
}
var b = B().Create("a","b");
##

【转】RSA私钥及公钥生成

原文地址:支付宝开放平台 – RSA私钥及公钥生成

生成方式一(推荐):使用支付宝提供的一键生成工具(内附使用说明)

解压打开文件夹,直接运行“支付宝RAS密钥生成器SHAwithRSA1024_V1.0.bat”(WINDOWS)或“SHAwithRSA1024_V1.0.command”(MACOSX),点击“生成RSA密钥”,会自动生成公私钥,然后点击“打开文件位置”,即可找到工具自动生成的密钥。

生成方式二:也可以使用OpenSSL工具命令生成 继续阅读【转】RSA私钥及公钥生成

【转】Java应用打包后运行需要注意编码问题

本文转载自:http://blog.csdn.net/chaijunkun/article/details/7624338

文章针对作者原文略有修改,以下是正文。

最近在做一个项目,项目总的来说就是和数据库打交道,取出数据来通过HTTP协议提交到一个接口上去。具体功能不多说了,只是讲这里面的一点——编码问题
项目当中,涉及到取所有数据的MD5值。
在Java项目中,个人喜欢将项目的默认编码改为UTF-8。使用的开发工具以Eclipse为主。然而,奇怪的问题出现了。当我在IDE中对项目进行调试的时候没有任何问题,但是打成了jar包后再通过

java -jar project.jar

运行的时候,每次提交数据,接口都会返回数据说我的签名不正确。换句话说就是我的最后一步,做MD5运算的时候出了问题。

为什么打了jar包就不行呢?几经波折,又是查看参数的hashCode,又是检查所有提交内容的十六进制数据,发现是文本编码出了问题。在Eclipse中是正确的,但是打出jar包后,启动命令行一直没设置字符串默认编码,因此java虚拟机就按照所在系统的默认编码运行了。我使用的是Windows环境,那么自然是GBK编码。

后来通过查阅资料,解决的办法就是加一个参数指定编码:
java -Dfile.encoding=utf-8 -jar project.jar
这样就可以了。工具正常运行了。

安全感

1.当女生向男生诉求的时候,是女生真正有需求的时候,如果男生能够真正听到女生的渴求,愿意做一些对自己无意义但是对女生很重要的事情,女生就会很有安全感。

2.亲密关系出大问题的多半是沟通上出了严重问题,好的沟通会带来安全感。

3.信任是你一次又一次的猜疑,结果被证实错误,然后对对方越来越信任。

 

参考链接:

1.男生什么样的行为让你觉得很没有安全感?

2.女生什么样的行为让你觉得很没有安全感?