自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 资源 (16)
  • 收藏
  • 关注

原创 Android key 派发机制笔记

昨天在公司遇到bug,Activity如法接受到触屏点击消息和按键消息。粗略的看了下Android的keyevent的派发机制,发现是被IME拦截处理了,所以不会在给Activity callback。先把简单流程图保存在此,以后有时间在深入学习。

2016-05-19 16:03:09 714

原创 ZeroMQ笔记

Request-Reply模式对于client来说必须严格按照先调用zmq_send()函数,然后调用zmq_recv()函数的顺序来执行对于server来说,执行时序相反如果不按照这个时序来,可能会发生错误,或者信息丢失可以有多个client同时连接到serverPublish-Subscribe模式SUB so

2015-03-18 15:11:32 1022

原创 Android Audio Policy小记

Android的Audio系统分为两大块,一块是audio的策略管理,即Audio Policy模块;一块是AudioFlinger模块,负责和Audio Hardware Module直接交互。本文主要讲解Audio Policy模块的以下知识点:1. audio policy策略文件的加载;2. 创建AudioRecord的时候,如何根据intput source选择合适的devi

2015-03-06 12:30:41 4313

原创 动态库运行时符号解析

现在有如下代码:main.c:#includevoid print() { printf("print in main.c \n");}int main() { func(); return 0;}temp.c:#includevoid print() { printf("print in temp.c \n");}void f

2015-03-03 15:12:35 1938

转载 How to compile/build QEMU 1.4.0 on Ubuntu 12.04

Download QEMUThe sources can be found here: http://wiki.qemu-project.org/download/qemu-1.4.0.tar.bz2wget http://wiki.qemu-project.org/download/qemu-1.4.0.tar.bz2Install dependenciesThis is

2015-02-12 16:02:48 750

原创 MediaPlayer UML图

2014-12-22 10:51:01 3181 3

原创 Android init.rc

1.init.rc中Service启动的几种方式

2014-10-21 17:13:08 716

原创 Android JNI局部引用表

1.什么是JNI局部引用表?JNI局

2014-08-22 08:44:21 1236

翻译 理解got和plt

理解elf的got和plt

2014-06-18 20:55:12 2822

原创 Android native层动态库注射

Android native 动态库注射,钩子函数的实现。

2014-06-18 09:08:37 2336

翻译 Tasks and Back Stack

Android Tasks and Back Stack

2014-06-12 11:51:26 897

翻译 Styles and Themes

Styles and Themes

2014-06-11 17:10:12 1198

翻译 Activity属性

Android Activity属性

2014-06-11 16:16:44 1369 1

翻译 OpenMax 初始化和数据流调用时序

OpenMax初始化和数据流的调用时序

2014-06-06 10:37:06 2377

翻译 OpenMax的数据类型

OpenMax的数据类型描述。

2014-06-05 17:37:20 2625 1

原创 Android Cursor浅析

Android Cursor分析

2014-06-05 12:58:10 5250 2

翻译 JNI设计概述

JNI设计翻译

2014-06-04 17:07:40 1206

原创 Android native CursorWindow数据保存原理

Android SQLite数据集buffer实现原理

2014-06-04 10:35:15 5910 1

原创 跟着Android学设计模式:代理(proxy)

Android Context所使用的代理设计模式UML图

2014-06-03 16:52:58 1784

原创 Android SQLiteDatabase分析

SQLiteDatabse UML类图

2014-05-30 17:16:58 1328

原创 Android MTP 文件浏览Demo

Android MTP文件浏览Demo

2014-05-29 15:09:03 2092

原创 MediaProvider 数据库Audio相关表格对应关系

MediaProvider Audio Uri与表格对应关系

2014-05-29 14:42:48 1422

翻译 OpenMAX IL介绍与其体系

OpenMax IL规范翻译

2014-05-26 09:42:16 3821 2

原创 Android MediaPlayer 框架UML图

Android MediaPlayer UML类图

2014-05-20 18:56:29 4323

原创 跟着Android学设计模式:命令模式(command)

首先看看什么是命令模式:1.意图:将一个请求封装成对象,从而使你

2014-05-20 14:28:35 1576

原创 c++类型转换

1.类型准换c++是强

2014-05-19 13:10:58 704

原创 Android sp,wp,RefBase浅析

对于native层new出来的c++对象的生命周期的管理,Android提供了

2014-05-18 19:45:38 1560

原创 Android MediaPlayer 客户端框架以及消息传递

当application需要播放音频或者视频

2014-05-16 17:32:40 1098

翻译 MediaPlayer状态机

Android在SDK中提供了MediaPlayer class用于控制Audio/video/stream的播放。对于Audio的整个控制

2014-05-16 16:16:55 1776

原创 跟着Android学设计模式:工厂方法(Factory method)

阅读Android的优秀源码,能够提高自己的设计能力和

2014-05-15 15:52:18 1231

原创 Android 应用编程基础

1.Android系统是一个多用户的Linux系统,默认情况下,Android系统给每一个app分配一个唯一的

2014-05-15 11:39:05 634

原创 Android AsyncTask 原理浅析

一张图说明AsyncTask的机制原理

2014-05-13 10:14:40 941

原创 Android 进程的重要程度等级划分

1.Foreground process   a.有一个A

2014-05-12 15:50:50 1978

原创 Android Binder 框架

图解Binder架构

2014-05-09 21:37:50 1025

原创 SQLiteDatabase资源释放

SQLiteDatabse是android SDK提供的一个sqlite管理类。用于

2014-05-04 10:01:05 3425

翻译 进程内存布局

每一个进程的虚拟内存空间采取了相似的布局。见下图:High AddressArgs and env vars Stack|V  Unused memory  ^|Heap  Uninitialized Data Segment (bss)exec. Initi

2014-04-16 17:44:40 719

翻译 处理器栈帧布局

函数的调用会导致隐式的内存分配,栈帧就是在

2014-04-16 16:38:46 1002

原创 c++基础知识

1.访问控制C++访问控制符有三个private、protected、public。一个类友元(包含友元函数或者友元类的成员函数或者友元类的所有成员函数)可以访问该类的任何成员(包括成员变量及成员方法)。除去友元外,private成员只有该类自身的成员函数可以访问,protected成员只有该类及其派生类的成员函数可以访问,public成员则该类及其派生类的成员

2013-01-31 17:37:13 610

转载 在笔记本安装Ubuntu11.04增强功能

sudo apt-get install dkms build-essential linux-headers-$(uname -r)sudo /etc/init.d/vboxadd setup

2012-09-29 00:06:19 667

转载 Ubuntu12.04 root用户登录设置

vi /etc/lightdm/lightdm.conf.  修改完的整个配置文件是 [SeatDefaults]greeter-session=unity-greeteruser-session=ubuntugreeter-show-manual-login=true #手工输入登陆系统的用户名和密码allow-guest=false   #不允许guest登

2012-09-28 23:47:43 745

elf 格式中文版

elf格式中文版,作者赵凤阳。感谢其作出的努力,以使后来者的学习之路变得轻松不少。

2014-06-23

MTP 文件浏览Demo

Android MTP文件浏览。简单的Demo,可以浏览连接到当前设备上的MTP设备文件。

2014-05-29

MP3格式解析

解析MP3音频格式 一、概述 MP3 文件是由帧(frame)构成的,帧是MP3 文件最小的组成单位。MP3 的全称应为MPEG1 Layer-3 音频文件,MPEG(Moving Picture Experts Group)在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG 音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即 Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层 次的编码。MPEG音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和MP2 的压缩率分别为4:1 和 6:1-8:1,而MP3 的压缩率则高达10:1-12:1,也就是说,一分钟CD 音质的音乐,未经压缩需要10MB的存储空间,而经过MP3 压缩编码后只有1MB 左右。不过MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3 采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。 名词解释: 比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送的数据越大。 比特率比特率表示经过编码(压缩)后的音、视频数据每秒钟需要用多少个比特来表示,而比特就是二进制里面最小的单位,要么是0,要么是1。比特率与音、视频压缩的关系,简单的说就是比特率越高,音、视频的质量就越好,但编码后的文件就越大;如果比特率越少则情况刚好相反。 采样率(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,单位用赫兹(Hz)来表示。采样频率的倒数是采样周期(也称为采样时间),它表示采样之间的时间间隔。这里要注意不要将采样率与位速相混淆。 二、MP3文件整体结构 MP3文件大体分为三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1) ID3V2标签帧 ID3v2在文件头,以字符串“ID3”为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。 音频数据帧 一系列的帧,个数由文件大小和帧长决定,每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定,每个FRAME又分为帧头和数据实体两部分,帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立 ID3V1标签帧 ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。 三、MP3结构具体分析 1.ID3V2标签 每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。 标签头 在文件的首部顺序记录10 个字节的ID3V2.3 的头部。数据结构如下: char Header[3]; /*必须为"ID3"否则认为标签不存在*/ char Ver; /*版本号ID3V2.3 就记录3*/ char Revision; /*副版本号此版本记录为0*/ char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/ char Size[4]; /*标签大小,包括标签头的10 个字节和所有的标签帧的大小*/ 注:最后4个字节表示ID3V2标签的大小,在实际寻找首帧的过程中,我发现大部分的mp3文件的标签大小是包含标签头的,但有的又是不包含的,可能是某些mp3编码器写标签的BUG,所以为了兼容只好认为其是包含的,如果按大小找不到,再向后搜索,直到找到首帧为止。 计算ID3V2标签帧的大小: 最后四个字节表示,但每个字节只用7 位,最高位不使用恒为0。所以格式如下: 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 计算大小时要将0 去掉,得到一个28 位的二进制数,就是标签大小(不懂为什么要这样做),计算公式如 下: int ID3V2_Size; ID3V2_Size = (Size[0]&0x7F;)*0x200000 +(Size[1]&0x7F;)*0x4000 +(Size[2]&0x7F;)*0x80 +(Size[3]&0x7F;) (2) 标签帧 每个标签帧都有一个10 个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中的到内容大小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。 一般我们从标签头中获取信息计算出整个ID3V2标签的大小即可,对于ID3V2的标签帧就不再仔细分析。 2.音频数据 数据帧往往有多个,至于有多少,由文件大小和帧大小来决定。每个帧都有一个四字节长的帧头,接下来可能有两个字节的CRC校验,其存在由帧头中的具体信息决定。接着就是帧的实体数据,也就是MAIN_DATA了。 (1)音频数据帧的帧头 格式如下: AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM 符号 长度(bit) 位置(bit) 描述 A 11 (31~21) 帧同步(所有位置1) B 2 (20~19) MPEG 音频版本ID 00 – MPEG 2.5 01 – 保留 10 – MPEG 2 (ISO/IEC 13818-3) 11 – MPEG 1 (ISO/IEC 11172-3) C 2 (18~17) Layer描述 00 - 保留 01 - Layer III 10 - Layer II 11 - Layer I D 1 (16) 校验位(0 - 紧跟帧头后有16位即2个字节用作CRC校验1 - 没有校验) E 4 (15~12) 比特率(位率)(见比特率索引表) F 2 (11~10) 采样率(见采样率索引表) G 1 (9) 填充位(填充用来达到正确的比特率。) 0 – 没有填充 1 – 填充了一个额外的空位 H 1 (8) 私有bit,可以用来做特殊应用。例如可以用来触发应用程序的特殊事件。 I 2 (7~6) 声道 00 立体声 01 联合立体声(立体声) 10 双声道(立体声) 11 单声道(单声) J 2 (5~4) 扩展模式(仅在联合立体声时有效) 扩展模式用来连接对立体声效果无用的信息,来减少所需的资源。这两个位在联合立体声模式下有编码器动态指定。 K 1 (3) 版权 0无版权 1有版权 L 1 (2) 原创 0 原创拷贝 1 原创 M 2 (1) 强调 00 - 无 01 - 50/15 ms 10 - 保留 11 - CCIT J.17 【帧头信息表】 索引值 MPEG1 MPEG2&MPEG2;.5 Layer1 Layer2 Layer3 Layer1 Layer2&3 0000 Free 0001 32 32 32 32 8 0010 64 48 40 48 16 0011 96 56 48 56 24 0100 128 64 56 64 32 0101 160 80 64 80 40 0110 192 96 80 96 48 0111 224 112 96 112 56 1000 256 128 112 128 64 1001 288 160 128 144 80 1010 320 192 160 160 96 1011 352 224 192 176 112 1100 384 256 224 192 128 1101 416 320 256 224 144 1110 448 384 320 256 160 1111 Bad 【比特率索引表】 Bits MPEG1 MPEG2 MPEG3 00 44100 22050 11025 01 48000 24000 12000 10 32000 16000 8000 11 保留 【采样率索引表】 (2)如何计算音频数据帧长度 我们首先区分两个术语:帧大小和帧长度。帧大小即每帧采样数表示一帧中采样的个数,这是恒定值。其值入下表所示 MPEG1 MPEG2 MPEG2.5 Layer1 384 384 384 Layer2 1152 1152 1152 Layer3 1152 576 576 【每帧采【每帧采样数表】 帧长度是压缩时每一帧的长度,包括帧头。它将填充的空位也计算在内。LayerI的一个空位长4字节,LayerII和LayerIII的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。 注意:因为有填充和比特率变换,帧长度可能变化。 从头中读取比特率,采样频率和填充, LyaerI使用公式: 帧长度(字节) = 每帧采样数 / 采样频率(HZ) * 比特率(bps)/ 8 +填充 * 4 LyerII和LyaerIII使用公式: 帧长度(字节)= 每帧采样数 / 采样频率(HZ) * 比特率(bps)/ 8 + 填充 例: LayerIII 比特率 128000,采样频率 44100,填充0 =〉帧大小 417字节 (3)计算每帧的持续时间 之前看了一些文章都说mp3的一帧的持续时间是26ms,结果在实际程序的编写中发现无法正确按时间定位到帧,然后又查了一些文章才知道,所谓26ms一帧只是针对MPEG1 Layer III而且采样率为44.1KHz来说是对的,但mp3文件并不都是如此,其实这个时间也是可以通过计算来获得,下面给出计算公式 每帧持续时间(秒) = 每帧采样数 / 采样频率(HZ) 可以这么理解:每帧采用数就是要采取的总数,采样率就是采取的速度,相除 就得到时间。 这样通过计算可知 MPEG1 Layer III 采样率为44.1KHz的一帧持续时间为26.12...不是整数,不过我们权且认为它就是26毫秒吧。 如果是MPEG2 Layer III 采样率为16KHz的话那一帧要持续36毫秒,这个相差还是蛮大的,所以还是应该通过计算来获的,当然可以按MPEG版本,层数和采样率来建一个表,这样直接查表就可以知道时间了。 3.ID3V1标签 ID3v1标签用来描述MPEG音频文件。包含艺术家,标题,唱片集,发布年代和流派。另外还有额外的注释空间。位于音频文件的最后固定为128字节。可以读取该文件的最后这128字节获得标签。以最后128个字节的头三个字节为“TAG”作为有ID3V1的判断依据。 结构如下: AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBB BCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE EFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFG 符号 长度(byte) 位置 描述 A 3 (0~2) 标签标志。如果存在标签并且正确的话,必须包含'TAG'。 B 30 (3~32) 标题 C 30 (33~62) 艺术家 D 30 (63~92) 唱片集 E 4 (93~96) 年代 F 30 (97~126) 注释 G 1 (127) 流派 有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。 四、解析方法 当你想读取MPEG文件的信息时,解析前三个字节,判断是否有ID3V2标签,有则根据上面的方法算出ID3V2标签的总大小,这样就找到了音频数据帧的第一帧,读取它的头信息,获取比特率、采样率、MPEG版本号、Layer描述号等信息,根据上面提供的方法算出每帧的长度和每帧持续时间,对于定比特率的其它帧是相同的,也就是说解析第一帧就达到了目的。但这也不是所有情况。变比特率的MPEG文件使用使用所谓比特变换,也就是说每一帧的比特率依照具体内容变化。这时就需要你每一帧都解析。

2012-07-28

51单片机TCP/IP源代码

//--------------------------------------------------------------------------- // Net MAIN.C // // 8051 Web Server project // See Makefile for build notes // Written for Keil C51 V5.1 compiler, notes: // It uses big endian order, which is the same as the // network byte order, unlike x86 systems. // Use OPTIMIZE(2)or higher so that automatic variables get shared // between functions, to stay within the 256 bytes idata space //--------------------------------------------------------------------------- #include #include #include "89E564RD.H" #include "net.h" #include "eth.h" #include "serial.h" #include "timer.h" #include "arp.h" #include "tcp.h" #include "http.h" #include "ip.h" // Global variables unsigned int volatile event_word; unsigned char idata debug; unsigned char idata rcve_buf_allocated; char xdata text[20]; // This sets my hardware address to 00:01:02:03:04:05 unsigned char code my_hwaddr[6] = {0x52, 0x54, 0x4c, 0xbb, 0x50, 0xd8}; // Hardware addr to send a broadcast unsigned char code broadcast_hwaddr[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // This sets my IP address to 192.168.0.168 unsigned long code my_ipaddr = 0xC0A800A8L; // This sets my subnet mask to 255.255.255.0 unsigned long code my_subnet = 0xFFFFFF00L; // Set to 0 if no gateway is present on network // unsigned long code gateway_ipaddr = 0; // This sets my gateway address to 192.168.0.1 unsigned long code gateway_ipaddr = 0xC0A80001L; //-------------------------------------------------------------------------- // Initialize the memory management routines // Initialize variables declared in main //-------------------------------------------------------------------------- unsigned int Count1msInc; unsigned char Count1ms,Count10ms,Count1s; unsigned char TimeSecond,TimeMinute; /***************************************************************************************** ** 函数名称: init_main(void) ** 功能描述: 主函数初始化 ** 调用参数: 无 ** 返回参数: 无 ** 调用模块: init_mempool((vo

2012-07-28

串行E2P ROM读写(24c02)

24c02驱动源代码 I2C总线驱动程序(用两个普通IO模拟I2C总线包括100Khz(T=10us)的标准模式(慢速模式)和400Khz(T=2.5us)的快速模式选择,默认11.0592Mhz的晶振。

2012-07-28

TCP/IP教程

学习TCP/IP的学习教程 很全面的入门教程

2012-07-28

riff文件格式分析软件

RIFF格式分析工具 做音视频分析的良好工具

2012-07-28

mp4info.exe

mp4 格式解析工具 可以分析出mp4的文件结构

2012-07-28

AtomicBrowser(AVI).exe

avi atom查看器 分析avi结构的利器 可以分析avi container的文件结构

2012-07-28

Asfview.exe

asf container分析工具 可以分析出asf的组成结构 stream信息 查看asf文件结构的利器

2012-07-28

Mp3解码流程

Mp3解码过程了解 Mp3 的解码总体上可分为9 个过程:比特流分解,霍夫曼解码,逆量化处理,立体声处 理,频谱重排列,抗锯齿处理,IMDCT 变换,子带合成,pcm 输出。 为了解上述9 个过程的由来,简要描述mp3 的压缩流程。声音是一个模拟信号,对声音 进行采样,量化,编码将得到PCM 数据。PCM 又称为脉冲编码调制数据,是电脑可以播放的 最原始的数据,也是MP3 压缩的源。为了达到更大的数据压缩率,MPEG 标准采用子带编码 技术将PCM 数据分成32 个子带,每个子带都是独立编码的(参考《数字音频原理与应用》 221 页)。然后将数据变换到频域下分析,MPEG 采用的是改进的离散余弦变换,也可以使用 傅利叶变换(参考《数字音频原理与应用》225)。再下来为了重建立体声进行了频谱按特定 规则的排列,随后立体声处理,处理后的数据按照协议定义进行量化。为了达到更大的压缩, 再进行霍夫曼编码。最后将一些系数与主信息融合形成mp3 文件。

2012-07-06

深入理解计算机系统

深入理解计算机系统pdf文档。不是特别的清晰,可以看看。如果书不错,还是购买正版的吧。

2012-07-01

WinHex WinHex_14.2_SR-3_SC

WinHex_14.2_SR-3_SC WinHex是一个专门用来对付各种日常紧急情况的小工具。它可以用来检查和修复各种文件、恢复删除文件、硬盘损坏造成的数据丢失等。同时它还可以让你看到其他程序隐藏起来的文件和数据。总体来说是一款非常不错的 16 进制编辑器。得到 ZDNetSoftwareLibrary 五星级最高评价,拥有强大的系统效用。

2012-07-01

uC/OS内核介绍和基于RTOS的设计介绍

内容介绍 1、 介绍uC/OS-II嵌入式操作系统 2、 基于uC/OS-II的用电管理终端软件的设计

2012-07-01

uitron specification

英文资料,详细讲述itron的原理和应用

2012-07-01

itron操作系统资料

基于 ITRON 标准的 RTOS 的原理和应用 详细讲解itron的基础原理和应用

2012-07-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除