- 博客(31)
- 问答 (1)
- 收藏
- 关注
原创 MediaCodec解码aac
上一篇博文介绍了如何用MediaCodec进行aac编码,这篇介绍如何解码,在解码上要注意的点是解码时要一帧一帧的喂给解码器而且得带adts头,另外要将头一帧的两个特殊字节用来对解码器进行配置,解码出来就是pcm编码的音频数据了,可以直接将pcm数据写进AudioTrack进行播放。/** * @author zhangsutao * @file AudioDecoder * @brie
2016-08-25 21:41:18
4795
3
原创 MediaCodec编码aac
我们可以用AudioRecoder对音频进行采集,采集的音频是pcm编码的原始数据,通过MediaCodec编码成aac音频,这里要注意的是编码出来是aac裸流,是无法播放的,要播放的话必须在每一帧音频前加adts头,adts头包含音频数据的采样率,升到,帧长度等信息,必须有adts头才可以正确解码。还有就是编码时出来的第一帧是一个两个字节的数据,这个数据也是比较特殊的需要用来在解码时配置解码器,
2016-08-25 21:32:48
3577
1
原创 MediaCodec解码h264流
上一篇博文介绍了如何用MediaCodec进行h264编码,这篇介绍如何用MediaCodec进行h264解码,解码时要注意的点就是要一帧一帧的喂给解码器,编码器是一帧一帧出数据的,网上有些demo居然拿一个定长的数组取数据喂给编码器(奇怪的是他居然说可以),还有就是要将sps和pps配置给解码器。另外MediaCodec可以将解码后的数据直接输出到一个Surface显示出来,我就是用一个Surf
2016-08-25 21:24:21
9557
4
原创 MediaCodec硬编码成H264视频流
android提供了一个强大的编解码类MediaCodec,可以实现对视频数据的编解码,下面讲一下如何对原始视频数据硬编码成h264格式的流MediaCodec提供两种方式的输入,一种是将数据写入它的输入缓冲队列里,一种是让MediaCodec建立一个输入Surface,MediaCodec会自动从这个输入Surface中读取数据,因为我做的是录制屏幕的需求,所以我是使用一个Surfa
2016-08-25 21:10:30
8837
10
原创 OpenGL texture黑边问题
用OpenGL的粒子系统制作一个动态滤镜时发现纹理被绘制成下面这样的效果: 而我的原图是可以看到花瓣的周围都黑了一圈最后发现是混合模式的问题,之前采用的混合模式是GLES20.glEnable(GLES20.GL_BLEND);GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
2016-06-21 13:37:06
4765
1
原创 皮肤亮白白——美颜算法
找到第一份实习,老大给我的第一个任务是实现美颜功能,网上找了一大堆资料,总的来说美颜的实现的步骤是:1.用具有保边效果的滤波算法对图像进行模糊处理2.用肤色检测算法保护非皮肤区域3.将模糊后的图像和原图进行图像融合4.对融合后的图像进行锐化处理对于步骤一,该滤波算法可以选择双边滤波,导向滤波,表面模糊等,只要能保边缘就行,高斯模糊是不行的,色斑逗逗就是在这一步磨掉的哈哈
2016-04-07 19:42:32
21320
15
原创 Java中的枚举类
Java枚举类1 在java中枚举用enum关键字来声明,定义格式为enum size{Small,MIDDLE,LARGE,EXTRA
2016-03-26 19:12:18
410
原创 Java对象初始化
最近刷面试题发现关于java 中new对象时构造函数,构造代码块等的调用顺序是常考点,下面的一些总结:请看下面的demo程序:public class Father { public static Variable a=new Variable(); public Variable b=new Variable(1); static{ System.out.p
2016-03-26 19:11:09
364
原创 单例模式写法
1.懒汉,线程不安全public class Singleton { private static Singleton instance=null; private Singleton(){ } public static Singleton getInstance(){ if(instance==null) instance=new Singleton(); r
2016-03-05 17:45:48
274
原创 Android内存优化—SparseArray和ArrayMap
在开发过程中,如果要使用键值对的方式来存储数据时,我们首先会想到的是HashMap,但了解HashMap的内部结构的话就知道,HashMap是比较消耗内存的,所以Android推出了SparseArray和ArrayMap来优化存储。让我们首先来看一下HashMap的存储结构,其实HashMap内部是一个哈希表,而且采用分离链表法来解决哈希冲突的问题,如下图另外HashMa
2016-03-05 15:46:20
429
原创 Application类使用笔记
Application是android app中的一个组件,当android程序启动时系统会创建一个Application对象。android系统会为每一个app默认创建一个applicaiton而且只有一个applicaiton,所以applicaiton是单例的。通常我们不需要自己定义application,若你要Applicaiton中部署一些全局的东西或者为了方便的获得Context,那么
2016-03-05 14:38:16
515
原创 Http协议学习笔记
Http(超文本传输协议)是Web服务器和客户端之间传输信息所用的协议,它运行在Tcp上。 在早期的Http1.0中,Tcp连接建立之后浏览器只发送一个请求,之后一个响应消息被发回来,在然后TCP连接就被释放了。但那是Web页面只包含Html文本,因此这样设计也够用,但后来Web页面发展成有大量图片以及其他精美的东西,这样的设计就导致了效率低下。为解决Http1.0效率低的问题,Http
2016-03-01 22:50:54
435
原创 自定义布局之宽高比布局的实现
最近在项目中遇到一个屏幕适配的问题,在显示图片时我在布局中宽度和高度都设置了固定的dp值,但当app运行在一些屏幕比较宽的手机上时,会出现图片宽高比不对情况,因为宽屏的手机横向的像素密度比较大,为此在网上找到一个解决方案是,定义一个可以根据图片本身宽高比来设置控件宽高的布局。实现如下首先声明两个属性,一个是picRatio表示图片的宽高比,一个是relative表示要根据宽度按比例确定高度,还
2016-02-29 09:07:08
942
原创 json解析之gson解析
我们知道在json中的两个基本结构是数组和对象,数组以[]括起来,数组里的值可以是数字、字符串、数组、对象几种;对象以{}括起来,对象中的数据是以键值对的形式出现的,键名就是属性名,键值就是属性值,属性值的类型可以是 数字、字符串、数组、对象几种。如果解析的json是一个对象,那么我们建一个这样的类并以键名作为属性名类型为属性值类型。如果属性值是一个数组,那就建立一个List属性,例如下面
2016-02-29 08:07:41
745
原创 Andorid 内容观察者的使用
ContentObserver的作用是监听特定uri的数据库的变化,从而可以及时的对数据进行处理用法:你需要注册内容观察者,调用如下代码: public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)当你不需要监听内容时,调用
2016-02-26 22:00:17
419
原创 程序锁的实现
许多安全软件都提供了程序锁服务,打开加锁的程序时必须正确输入密码才能够进入程序,那么如何实现程序锁呢?程序锁基本原理就是监控Activity的任务栈,核心方法如下:private void appLock() { // TODO Auto-generated method stub new Thread(new Runnable(){ @Override
2016-02-26 20:50:07
1331
原创 SurfaceView原理与使用
SurfaceView内嵌了一个专门用于绘制的surface,你可以控制它的大小。他与普通的View的最大的不同之处在于,它可以在非ui线程中绘制图像。因此用SurfaceView绘制图形不用考虑主线程过于繁忙而无法处理其他东西(ANR)的问题,从而可以获得更高的帧率,降低主线程的负担。用法:首先继承SurfaceView并实现SurfaceHolder.Callback接
2016-02-23 15:48:01
1517
原创 android屏幕适配
1 .设备像素适配单位介绍:px,pt,dp,sp,dpidpi:像素密度,它指的是屏幕每英寸所包含的像素数,它的算法是:屏幕对角线上的像素数量/屏幕对角线长(英寸)例如:手机分辨率是320*480,屏幕宽是2英寸,长3英寸,那么用勾股定理算出对角线的像素数量和长,最后结果是160dpipx:是像素的意思,即屏幕中可以显示的最小元素单元。pt:是磅数的意思,一磅等于1/72英寸
2016-01-05 10:15:07
364
原创 Android性能优化----图片三级缓存
当我们在app中加载大量的图片时,稍有不注意就容易出现OOM异常,为了避免出现这样的问题并保证好的用户的体验,做好缓存是非常重要,下面介绍如何为图片做三级缓存,所谓三级缓存是指在文件和内存中都做缓存,所需的数据首先从内存中做的缓存中取,当内存中没有缓存时再从文件中的缓存取,当文件中的缓存也没有时,就通过网络访问服务器取并在取到数据后,在内存和文件中都做一个缓存。在内存中的缓存我们使用LruCa
2016-01-03 19:47:17
498
原创 自定义Toast的实现
Toast在我们的应用开发中是最常见不过的控件了,系统默认的控件样式固定,如果要做出比较炫的Toast就需要自定义Toast了。用过腾讯手机管家的朋友一定不会忘了那个在主界面可以发射的小火箭:其实这就是一个自定义的Toast。下面将讲述自定义Toast的方法。首先分析系统Toast的实现:在Toast中有一个叫TN的内部类,它的构造函数如下: TN() {
2015-12-18 17:02:55
668
原创 笔记本电脑做服务器供Android手机访问
在做一些网络应用的时候,需要访问服务器获取内容,你可能会说没有服务器该怎么办?怎么调试?以下几步教你解决:1 在电脑上下载Tomcat服务器,并开启,关于Tomcat的用法就不多说了。2 在windows控制台输入ipconfig获取电脑的ip地址,比如我的电脑ip是:192.168.199.383 用360免费wifi之类的软件,使笔记本放出wifi信号,并让手机连接(注
2015-12-18 15:22:36
1541
原创 Android自定义属性
在自定义控件时,有时候会用到自定义属性,那么如何自定义属性呢?步骤如下:1.在res/values中创建attrs.xml文件,代码如下: 在上面的代码中,创建了两个自定义的属性分别是"title"和”content“,它们的值得类型是字符串。2,在要使用自定义属性的xml文件中,声明自定义命名空间,代码如下:<Linea
2015-12-18 14:52:23
469
原创 通过aidl实现挂断电话
如何实现挂断电话?在安卓1.5版本以前,TelephonyManager 类有一个endCall方法可以直接调用就可以实现挂断电话的功能了,不过在这之后出于安全考虑,这个方法被阉割了。那么在1.5之后要如果要实现自动挂断电话,就必须通过aidl来实现,其实1.5之前endCall方法也是通过这样实现的。在TelephoneManager的源代码中有一个方法如下:private ITelephony
2015-12-18 14:00:49
677
2
原创 弹出窗体PopupWindow的使用
PopupWindow,也就是弹出窗体,是我们在许多app常见的一种界面形式,在弹出的窗体的中可以显示任意的ui控件,并且可以在屏幕的任意位置显示,非常的灵活。下面是使用popupWindow的一些主要步骤:1 在res/layout目录下定义一个你想在PopupWindow中显示的界面,如下:<LinearLayout xmlns:android="http://schemas.andr
2015-12-14 16:55:10
683
翻译 定制控件Custom Components
基于两个基础的类:View和ViewGroup,Android提供了一个精致而强大的组件化的用户界面。此前,Android平台预先提供了各种各样的View和ViewGroup的子类——被称作widgets和layouts。当然你也可以单独的构建你自己的ui。可用的widgets包括 Button, TextView, EditText, ListView,CheckBox, RadioBut
2015-10-04 15:29:25
464
翻译 Connectivity-----Wi-Fi Peer-to-Peer
Wifi peer-to-peer允许Android 4.0(API level14)或以后的拥有wifi硬件的设备通过wifi直接互相连接,而不用中间媒介(Android的wifi P2p框架符合wifi联盟的认证计划)。通过使用该框架的api,你可以在相互间都支持wifi p2p时发现并连接其他设备,并且比蓝牙更远距离且更高速度地互相通信。这对于用户之间共享数据是非常有用的,例如多玩家游戏或者
2015-09-25 17:15:27
673
翻译 APP Resource——Handling Runtime Change
一些设备的参数会在运行时改变(如屏幕方向,键盘是可用性,语言等),当这样的变化发生Android会重新启动当前正在运行的Activity(调用onDestroy()再调用onCreate())。重启动的设计是为了帮助你的程序通过自动加载匹配新的设备参数的资源文件来适应参数的变化。要恰当的处理重启动,需要确保你的activity能够通过一般的生命周期(通过在销毁activity之前调用onSaveI
2015-09-25 13:56:17
417
转载 view的触摸事件OnTouch与监听
转自 http://www.apkbus.com/forum.php?mod=viewthread&tid=243810&extra=触摸,手势操作已经很好的融入了我们的生活。那么Android开发中触摸事件要如何捕捉?如何处理?如何识别手势?事件的传递机制又是怎么样的?下面我们将通过一个小例子来进行这方面的学习。onTouch事件做什么都好先了解原理以后的工作
2015-07-25 21:09:32
3806
原创 关于使用view的getLeft(),getTop()等方法的问题
1,为什么我有时候在使用getLeft(), getRight(), getTop(), getBottom()它们得到的结果是0?答: 出现这种情况可能是在刚启动程序,程序刚开始绘制 view 的时候,你马上使用代码去捕获上面的值。这个时候,由于view 是刚开始绘制的,你得到的就会是 0 。在Activity的onCreate方法中使用这些方法的时候结果就会使0.验证我上面
2015-07-22 14:40:19
1925
1
原创 Spinner的Android:prompt无法显示文本
1、XML文件中Spinner组件的代码:2、values string中的值:3、结果显示, 只有 android:entries的值, 没有显示Android:prompt这是因为prompt属性只在dialog状态才有用,解决方法:在XML中,将style设置为Widget.Spinner , 代码如下: style="@android
2015-07-12 09:29:55
6079
1
空空如也
Javascript 设置cookie后,jquery请求无法带上?
2017-12-07
TA创建的收藏夹 TA关注的收藏夹
TA关注的人