Android开发权威指南的图书目录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发权威指南的图书目录相关的知识,希望对你有一定的参考价值。
参考技术A第一部分 准备篇
第1章 初识庐山真面目——android开发简介 2
1.1 Android的基本概念 2
1.1.1 Android简介 2
1.1.2 Android的版本 4
1.1.3 Android的系统构架 5
1.1.4 Android的应用程序框架 6
1.2 JIL Widget介绍 7
1.3 小结 8
第2章 工欲善其事,必先利其器——搭建和使用Android开发环境 9
2.1 开发包及工具的安装 9
2.1.1 开发Android程序都需要些什么 9
2.1.2 安装JDK和配置Java开发环境 10
2.1.3 Eclipse的安装与汉化 11
2.1.4 安装AndroidSDK 12
2.1.5 安装Eclipse插件ADT 13
2.2 真实体验——编写第一个Android程序(随机绘制圆饼) 15
2.2.1 创建Android工程 15
2.2.2 在模拟器中运行Android程序 17
2.2.3 界面控件的布局 19
2.2.4 编写代码 20
2.2.5 调试程序 23
2.2.6 在手机上运行和调试程序 28
2.3 迁移Android工程可能发生的错误 29
2.4 不需要写一行代码的开发工具:AppInventor 31
2.4.1 AppInventor简介 31
2.4.2 AppIntentor的下载和安装 31
2.4.3 用拖曳控件的方式设计界面 33
2.4.4 像拼图一样拼装代码 34
2.5 小结 37
第二部分 基础篇
第3章 千里之行始于足下——Android程序设计基础 40
3.1 Android应用程序框架 40
3.1.1 Android项目的目录结构 40
3.1.2 AndroidManifest.xml文件的结构 42
3.2 Android应用程序中的资源 44
3.3 Android的应用程序组件 44
3.3.1 Activity(Android的窗体) 45
3.3.2 Service(服务) 45
3.3.3 Broadcast Receiver(广播接收器) 45
3.3.4 Content Provider(内容提供者) 46
3.4 Android程序的UI设计 46
3.4.1 手工配置XML布局文件 46
3.4.2 ADT自带的可视化UI设计器 47
3.4.3 使用DroidDraw设计UI布局 47
3.5 小结 48
第4章 我的UI我做主——用户界面开发基础 49
4.1 Activity的使用方法 49
4.1.1 创建Activity 49
4.1.2 配置Activity 50
4.1.3 显示其他的Activity(Intent与Activity) 52
4.2 Activity的生命周期 55
4.3 在不同Activity之间传递数据 60
4.3.1 使用Intent传递数据 60
4.3.2 使用静态变量传递数据 62
4.3.3 使用剪切板传递数据 63
4.3.4 使用全局对象传递数据 65
4.3.5 返回数据到前一个Activity 67
4.4 视图(View) 68
4.4.1 视图简介 68
4.4.2 使用XML布局文件定义视图 69
4.4.3 在代码中控制视图 70
4.5 布局(Layout) 72
4.5.1 框架布局(FrameLayout) 72
4.5.2 线性布局(LinearLayout) 75
4.5.3 相对布局(RelativeLayout) 79
4.5.4 表格布局(TableLayout) 81
4.5.5 绝对布局(AbsoluteLayout) 82
4.5.6 重用XML布局文件 82
4.5.7 优化XML布局文件 85
4.5.8 查看apk文件中的布局 86
4.6 小结 87
第5章 良好的学习开端——控件(Widget)详解 88
5.1 常用XML属性解析 88
5.1.1 android:id属性 88
5.1.2 控件的宽度(android:layout_width)和高度(android:layout_height) 88
5.1.3 android:layout_margin属性 89
5.1.4 android:padding属性 89
5.1.5 android:layout_weight属性 90
5.1.6 android:layout_gravity和android:gravity属性 90
5.1.7 android:visibility属性 91
5.1.8 android:background属性 91
5.1.9 指定单击事件方法(android:onClick属性) 92
5.1.10 控件焦点属性(android:focusable和android:focusable-InTouchMode) 92
5.2 TextView(显示文本的控件) 93
5.2.1 显示富文本(URL、不同大小、字体、颜色的文本) 93
5.2.2 在TextView中显示表情图像和文字 97
5.2.3 单击链接弹出Activity 100
5.2.4 为指定文本添加背景 103
5.2.5 带边框的TextView 106
5.2.6 设置行间距 110
5.2.7 在未显示完的文本后面加省略号(…) 111
5.2.8 用TextView实现走马灯效果 113
5.2.9 垂直滚动TextView中的文本 114
5.3 EditText(编辑文本的控件) 115
5.3.1 像QQ一样输入表情图像 115
5.3.2 在EditText中输入特定的字符 117
5.3.3 AutoCompleteText-View(自动完成输入内容的控件) 118
5.4 按钮和复选框控件 120
5.4.1 Button(普通按钮控件) 120
5.4.2 图文混排的按钮 122
5.4.3 ImageButton(图像按钮控件) 124
5.4.4 RadioButton(选项按钮控件) 124
5.4.5 ToggleButton(开关状态按钮控件) 125
5.4.6 CheckBox(复选框控件) 126
5.5 ImageView(显示图像的控件) 128
5.5.1 ImageView控件的基本用法 128
5.5.2 显示指定区域的图像 129
5.5.3 缩放和旋转图像 132
5.6 时间与日期控件 133
5.6.1 DatePicker(输入日期的控件) 133
5.6.2 TimePicker(输入时间的控件) 134
5.6.3 DatePicker、TimePicker与TextView同步显示日期和时间 134
5.6.4 AnalogClock和DigitalClock(显示时钟的控件) 136
5.7 进度条控件 137
5.7.1 ProgressBar(进度条控件) 137
5.7.2 SeekBar(拖动条控件) 139
5.7.3 设置ProgressBar和SeekBar的颜色及背景图 140
5.7.4 RatingBar(评分控件) 143
5.8 列表控件 145
5.8.1 ListView(普通列表控件) 145
5.8.2 为ListView列表项添加复选框和选项按钮 147
5.8.3 对列表项进行增、删、改操作 149
5.8.4 改变列表项的背景色 153
5.8.5 ListActivity(封装ListView的Activity) 154
5.8.6 ExpandableListView(可扩展的列表控件) 155
5.8.7 Spinner(下拉列表控件) 157
5.9 滚动控件 160
5.9.1 ScrollView(垂直滚动控件) 160
5.9.2 HorizontalScrollView(水平滚动控件) 161
5.9.3 可垂直和水平滚动的视图 162
5.9.4 Gallery(画廊控件) 163
5.10 ImageSwitcher(图像切换控件) 164
5.11 GridView(网格控件) 166
5.12 TabHost(标签控件) 168
5.13 ViewStub(惰性装载控件) 169
5.14 小结 171
第6章 友好的菜单——Menu介绍与实例 172
6.1 菜单的基本用法 172
6.1.1 创建选项菜单(Options Menu) 172
6.1.2 带图像的选项菜单 173
6.1.3 关联Activity 173
6.1.4 响应菜单的单击动作 174
6.1.5 动态添加、修改和删除选项菜单 175
6.1.6 带复选框和选项按钮的子菜单 176
6.1.7 上下文菜单 178
6.1.8 菜单事件 179
6.1.9 从菜单资源中装载菜单 180
6.2 菜单特效 181
6.2.1 自定义菜单 181
6.2.2 模拟UCWeb效果菜单 184
6.2.3 QuickContactBadge与联系人菜单 189
6.3 小结 192
第7章 友好地互动交流——信息提醒(对话框、Toast与Notification) 193
7.1 对话框的基本用法 193
7.1.1 带2个按钮(确认/取消)的对话框 193
7.1.2 带3个按钮(覆盖/忽略/取消)的对话框 195
7.1.3 简单列表对话框 196
7.1.4 单选列表对话框 198
7.1.5 多选列表对话框 199
7.1.6 进度对话框 201
7.1.7 登录对话框 205
7.1.8 使用Activity托管对话框 207
7.2 对话框的高级应用 209
7.2.1 阻止单击按钮关闭对话框 209
7.2.2 改变对话框的显示位置 213
7.2.3 在对话框按钮和内容文本中插入图像 215
7.2.4 改变对话框的透明度 216
7.3 Toast 217
7.3.1 Toast的基本用法 217
7.3.2 永不关闭的Toast 218
7.3.3 用PopupWindow模拟Toast提示信息框 221
7.4 通知(Notification) 221
7.4.1 在状态栏上显示通知信息 222
7.4.2 Notification的清除动作 224
7.4.3 永久存在的Notification 225
7.4.4 自定义Notification 226
7.5 小结 227
第8章 移动的信息仓库——数据存储 228
8.1 读写key-value对:SharedPreferences 228
8.1.1 SharedPreferences的基本用法 228
8.1.2 数据的存储位置和格式 229
8.1.3 存取复杂类型的数据 230
8.1.4 设置数据文件的访问权限 233
8.1.5 可以保存设置的Activity:PreferenceActivity 234
8.2 文件存储 238
8.2.1 openFileOutput和openFileInput方法 238
8.2.2 读写SD卡中的文件 239
8.2.3 SAX引擎读取XML文件的原理 241
8.2.4 将XML文件转换成Java对象 242
8.2.5 文件压缩(Jar、Zip) 245
8.3 SQLite数据库 249
8.3.1 SQLite数据库管理工具 249
8.3.2 SQLiteOpenHelper类与自动升级数据库 251
8.3.3 数据绑定与SimpleCursorAdapter类 252
8.3.4 操作SD卡上的数据库 255
8.3.5 将数据库与应用程序一起发布 256
8.3.6 内存数据库 257
8.4 小结 258
第9章 Android中的窗口——Activity 259
9.1 调用其他程序中的Activity 259
9.1.1 直接拨号 259
9.1.2 将电话号传入拨号程序 259
9.1.3 调用拨号程序 260
9.1.4 浏览网页 261
9.1.5 向E-mail客户端传递E-mail地址 261
9.1.6 发送E-mail 261
9.1.7 查看联系人 262
9.1.8 显示系统设置界面(设置主界面、Wifi设置界面) 263
9.1.9 启动处理音频的程序 264
9.2 自定义Activity Action 264
9.3 Activity的高级应用 266
9.3.1 ActivityGroup 266
9.3.2 自定义半透明窗口 268
9.3.3 Activity之间切换的动画效果 269
9.4 小结 270
第10章 全局事件——广播(Broadcast) 271
10.1 什么是广播 271
10.2 接收系统广播 272
10.2.1 短信拦截 272
10.2.2 用代码注册广播接收器 274
10.2.3 广播接收器的优先级 275
10.2.4 来去电拦截 276
10.2.5 截获屏幕休眠与唤醒 280
10.2.6 开机自动运行 281
10.2.7 显示手机电池的当前电量 282
10.3 发送广播 284
10.4 验证广播接收器是否注册 285
10.5 小结 286
第11章 跨应用数据源——Content Provider 287
11.1 Content Provider的作用 287
11.2 获得系统数据 288
11.2.1 读取联系人信息 288
11.2.2 查看收到的短信 290
11.3 自定义Content Provider 291
11.3.1 查询城市信息 291
11.3.2 为Content Provider添加访问权限 297
11.4 小结 298
第12章 一切为用户服务——Service基础与实例 299
12.1 Service基础 299
12.1.1 Service的生命周期 299
12.1.2 绑定Activity和Service 302
12.1.3 开机启动Service 305
12.1.4 判断Service是否已注册 306
12.1.5 判断Service是否已开始 307
12.2 跨进程访问(AIDL服务) 308
12.2.1 什么是AIDL服务 308
12.2.2 建立AIDL服务的步骤 308
12.2.3 建立AIDL服务 308
12.2.4 传递复杂数据的AIDL服务 312
12.2.5 AIDL与来去电自动挂断 317
12.3 小结 319
第13章 做好应用桥梁——网络与通信 320
13.1 WebView控件 320
13.1.1 用WebView控件浏览网页 320
13.1.2 用WebView控件装载html代码 322
13.2 访问HTTP资源 324
13.2.1 提交HTTP GET和HTTP POST请求 324
13.2.2 HttpURLConnection类 326
13.2.3 上传文件 327
13.3 客户端Socket 330
13.3.1 连接服务器 331
13.3.2 扫描服务器打开的端口 331
13.3.3 发送和接收数据 333
13.3.4 获得无线路由分配给手机的IP地址 334
13.3.5 设置Socket选项 335
13.4 服务端Socket 339
13.4.1 手机服务器的实现 339
13.4.2 利用Socket在应用程序之间通信 340
13.5 蓝牙通信 342
13.5.1 蓝牙简介 342
13.5.2 打开和关闭蓝牙设备 343
13.5.3 搜索蓝牙设备 344
13.5.4 蓝牙数据传输 346
13.6 小结 351
第14章 炫酷你的应用——多媒体开发 352
14.1 音乐 352
14.1.1 播放音乐 352
14.1.2 录音 353
14.2 视频 354
14.2.1 使用VideoView播放视频 354
14.2.2 使用SurfaceView播放视频 355
14.2.3 录制视频 357
14.3 相机 357
14.3.1 调用系统的拍照功能 358
14.3.2 自定义拍照功能 359
14.4 铃声 364
14.5 小结 366
第15章 2D游戏开发 367
15.1 绘制游戏的画布 367
15.1.1 在View上实现动画效果 367
15.1.2 在SurfaceView上实现动画效果 371
15.2 图形绘制基础 374
15.2.1 绘制像素点 374
15.2.2 绘制直线 374
15.2.3 绘制圆形 375
15.2.4 绘制弧 375
15.2.5 绘制文本 376
15.2.6 综合绘制各种图形 376
15.3 高级图像处理技术 380
15.3.1 绘制位图 380
15.3.2 图像的透明度 382
15.3.3 旋转图像 383
15.3.4 路径 384
15.3.5 Shader的渲染效果 388
15.4 帧(Frame)动画 392
15.4.1 AnimationDrawable与帧动画 392
15.4.2 播放Gif动画 394
15.5 补间(Tween)动画 397
15.5.1 移动补间动画 397
15.5.2 缩放补间动画 399
15.5.3 旋转补间动画 402
15.5.4 透明度补间动画 403
15.6 小结 404
第16章 有趣的Android应用 405
16.1 传感器 405
16.1.1 如何使用传感器 405
16.1.2 加速度传感器(Accelerometer) 409
16.1.3 重力传感器(Gravity) 409
16.1.4 光线传感器(Light) 410
16.1.5 陀螺仪传感器(Gyroscope) 411
16.1.6 方向传感器(Orientation) 411
16.1.7 其他传感器 412
16.2 输入输出技术 413
16.2.1 语音识别 413
16.2.2 手势输入 415
16.2.3 语音朗读(TTS) 417
16.3 Google地图 419
16.4 GPS定位 423
16.5 桌面上的小东西 425
16.5.1 窗口小部件(AppWidget) 425
16.5.2 快捷方式 431
16.5.3 实时文件夹 433
16.6 应用更华丽——动态壁纸 435
16.7 小结 441
第三部分 高级篇
第17章 HTML5与移动Web开发 444
17.1 HTML5简介 444
17.2 HTML5精彩效果演示 445
17.3 HTML5在Android中的应用 447
17.4 HTML5的画布(Canvas) 448
17.4.1 Canvas概述 448
17.4.2 检测浏览器是否支持Canvas 449
17.4.3 在Web页面中使用Canvas 450
17.4.4 使用路径(Path) 452
17.4.5 设置线条风格 453
17.4.6 设置填充类型 453
17.4.7 填充矩形区域 454
17.4.8 使用渐变色(Gradient) 454
17.4.9 拉伸画布对象 455
17.4.10 在Canvas上绘制文本 456
17.4.11 使用阴影 457
17.5 调试javascript 458
17.6 小结 459
第18章 输入法开发 460
18.1 Android输入法简介 460
18.2 控制输入法 461
18.3 输入法实战 462
18.3.1 实现输入法的步骤 463
18.3.2 编写输入法程序 463
18.3.3 输入法服务的生命周期 466
18.3.4 预输入文本 467
18.3.5 输入法设置 467
18.4 小结 468
第19章 Android OpenGL ES开发基础 469
19.1 OpenGL简介 469
19.2 什么是OpenGL ES 469
19.3 多边形 470
19.4 颜色 474
19.5 旋转三角形 475
19.6 旋转立方体 477
19.7 小结 478
第20章 OpenGL ES的超酷效果 479
20.1 保持平衡的旋转文本 479
20.2 左右摇摆的Android机器人 482
20.3 纠缠在一起的旋转立方体 485
20.4 透明背景的旋转立方体 486
20.5 触摸旋转的立方体 487
20.6 2D和3D的综合旋转效果 489
20.7 旋转立体天空 491
20.8 小结 493
第21章 Android NDK编程 494
21.1 Android NDK简介 494
21.2 安装、配置和测试NDK开发环境 495
21.2.1 系统和软件要求 495
21.2.2 下载和安装Android NDK 495
21.2.3 下载和安装Cygwin 495
21.2.4 配置Android NDK的开发环境 498
21.3 第一个NDK程序:世界你好 499
21.3.1 编写和调用NDK程序 499
21.3.2 用命令行方式编译NDK程序 501
21.3.3 在Eclipse中集成Android NDK 502
21.4 背景不断变化的三角形(NDK 版OpenGL ES) 504
21.5 使用NDK OpenGL ES API实现千变万化的3D效果 507
21.6 使用NDK调用音频API 510
21.7 本地Activity(Native Activity) 511
21.8 Android NDK配置文件详解 513
21.8.1 Android NDK定义的变量 513
21.8.2 Android NDK定义的函数 514
21.8.3 描述模块的变量 515
21.8.4 配置Application mk文件 516
21.9 小结 516
第22章 测试驱动开发(TDD) 517
22.1 JUnit测试框架 517
22.2 测试Activity 517
22.3 测试Content Provider 521
22.4 测试Service 523
22.5 测试普通类 523
22.6 小结 525
第四部分 综合实例篇
第23章 Android综合案例一——蓝牙聊天 528
23.1 蓝牙聊天主界面 528
23.2 添加选项菜单 530
23.3 搜索和连接蓝牙设备 530
23.4 使设备可被其他蓝牙设备发现 533
23.5 发送和接收聊天信息 533
23.6 小结 537
第24章 Android综合案例二——月球登陆(游戏) 538
24.1 游戏的玩法 538
24.2 实现游戏界面 539
24.3 设置游戏难度 540
24.4 开始游戏 541
24.5 控制飞船喷火 544
24.6 控制飞船改变飞行方向 544
24.7 判断飞船是否成功着陆 545
24.8 小结 546
第25章 Android综合案例三——全键盘输入法(应用) 547
25.1 安装输入法 547
25.2 输入法的初始化工作 548
25.3 响应键盘操作 549
25.4 根据EditText控件的属性显示不同的软键盘 551
25.5 小结 553
第26章 Android综合案例四——贪吃蛇(游戏) 554
26.1 游戏玩法 554
26.2 游戏主界面设计 555
26.3 控制小蛇的移动 557
26.4 小结 560
第27章 Android综合案例五——新浪微博客户端(应用) 561
27.1 新浪微博简介 561
27.1.1 新浪微博客户端 561
27.1.2 新浪微博开放API 563
27.2 使用新浪微博开发API 563
27.3 创建和配置新浪微博客户端工程 564
27.4 登录新浪微博 564
27.5 功能按钮 567
27.6 显示“我的首页”的微博 569
27.7 评论微博 572
27.8 转发微博 573
27.9 写微博 574
27.10 小结 576
第28章 Android综合案例六——笑脸连连看(游戏) 577
28.1 游戏玩法 577
28.2 准备图像素材 578
28.3 实现主界面 578
28.4 随机生成连连看图像 580
28.5 选中两个相同图像后消失 580
28.6 用定时器限制游戏时间 581
28.7 小结 582
Android音视频开发,android驱动开发权威指南pdf
除了I/P/B帧外,还有图像序列GOP。
- GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7oDJR6mL-1608540503824)(https://upload-images.jianshu.io/upload_images/24944255-2695e751eab6dfd4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
下面我们就来详细描述一下H264压缩技术。
H264的基本原理其实非常简单,下我们就简单的描述一下H264压缩数据的过程。通过摄像头采集到的视频帧(按每秒 30 帧算),被送到 H264 编码器的缓冲区中。编码器先要为每一幅图片划分宏块。
以下面这张图为例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ROx36Cy-1608540503826)(https://upload-images.jianshu.io/upload_images/24944255-e0747887a7bb7448.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
划分宏块
H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OVsdtFn6-1608540503829)(https://upload-images.jianshu.io/upload_images/24944255-e70c8be50e33b9c2.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
划分好宏块后,计算宏块的象素值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2cbCrzL6-1608540503833)(https://upload-images.jianshu.io/upload_images/24944255-248e49d8d6041468.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
以此类推,计算一幅图像中每个宏块的像素值,所有宏块都处理完后如下面的样子。
划分子块
H264对比较平坦的图像使用 16X16 大小的宏块。但为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活。
上幅图中,红框内的 16X16 宏块中大部分是蓝色背景,而三只鹰的部分图像被划在了该宏块内,为了更好的处理三只鹰的部分图像,H264就在 16X16 的宏块内又划分出了多个子块。
这样再经过帧内压缩,可以得到更高效的数据。下图是分别使用mpeg-2和H264对上面宏块进行压缩后的结果。其中左半部分为MPEG-2子块划分后压缩的结果,右半部分为H264的子块划压缩后的结果,可以看出H264的划分方法更具优势。
宏块划分好后,就可以对H264编码器缓存中的所有图片进行分组了。
帧分组
对于视频数据主要有两类数据冗余,一类是时间上的数据冗余,另一类是空间上的数据冗余。其中时间上的数据冗余是最大的。下面我们就先来说说视频数据时间上的冗余问题。
为什么说时间上的冗余是最大的呢?假设摄像头每秒抓取30帧,这30帧的数据大部分情况下都是相关联的。也有可能不止30帧的的数据,可能几十帧,上百帧的数据都是关联特别密切的。
对于这些关联特别密切的帧,其实我们只需要保存一帧的数据,其它帧都可以通过这一帧再按某种规则预测出来,所以说视频数据在时间上的冗余是最多的。
为了达到相关帧通过预测的方法来压缩数据,就需要将视频帧进行分组。那么如何判定某些帧关系密切,可以划为一组呢?我们来看一下例子,下面是捕获的一组运动的台球的视频帧,台球从右上角滚到了左下角。
H264编码器会按顺序,每次取出两幅相邻的帧进行宏块比较,计算两帧的相似度。如下图:
通过宏块扫描与宏块搜索可以发现这两个帧的关联度是非常高的。进而发现这一组帧的关联度都是非常高的。因此,上面这几帧就可以划分为一组。其算法是:在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。
在这样一组帧中,经过编码后,我们只保留第一帖的完整数据,其它帧都通过参考上一帧计算出来。我们称第一帧为IDR/I帧,其它帧我们称为P/B帧,这样编码后的数据帧组我们称为GOP。
运动估计与补偿
在H264编码器中将帧分组后,就要计算帧组内物体的运动矢量了。还以上面运动的台球视频帧为例,我们来看一下它是如何计算运动矢量的。
H264编码器首先按顺序从缓冲区头部取出两帧视频数据,然后进行宏块扫描。当发现其中一幅图片中有物体时,就在另一幅图的邻近位置(搜索窗口中)进行搜索。如果此时在另一幅图中找到该物体,那么就可以计算出物体的运动矢量了。下面这幅图就是搜索后的台球移动的位置。
通过上图中台球位置相差,就可以计算出台图运行的方向和距离。H264依次把每一帧中球移动的距离和方向都记录下来就成了下面的样子。
运动矢量计算出来后,将相同部分(也就是绿色部分)减去,就得到了补偿数据。我们最终只需要将补偿数据进行压缩保存,以后在解码时就可以恢复原图了。压缩补偿后的数据只需要记录很少的一点数据。如下所示:
我们把运动矢量与补偿称为帧间压缩技术,它解决的是视频帧在时间上的数据冗余。除了帧间压缩,帧内也要进行数据压缩,帧内数据压缩解决的是空间上的数据冗余。下面我们就来介绍一下帧内压缩技术。
帧内预测
人眼对图象都有一个识别度,对低频的亮度很敏感,对高频的亮度不太敏感。所以基于一些研究,可以将一幅图像中人眼不敏感的数据去除掉。这样就提出了帧内预测技术。
H264的帧内压缩与JPEG很相似。一幅图像被划分好宏块后,对每个宏块可以进行 9 种模式的预测。找出与原图最接近的一种预测模式。
下面这幅图是对整幅图中的每个宏块进行预测的过程。
帧内预测后的图像与原始图像的对比如下:
然后,将原始图像与帧内预测后的图像相减得残差值。
再将我们之前得到的预测模式信息一起保存起来,这样我们就可以在解码时恢复原图了。效果如下:
经过帧内与帧间的压缩后,虽然数据有大幅减少,但还有优化的空间。
对残差数据做DCT
可以将残差数据做整数离散余弦变换,去掉数据的相关性,进一步压缩数据。如下图所示,左侧为原数据的宏块,右侧为计算出的残差数据的宏块。
将残差数据宏块数字化后如下图所示:
将残差数据宏块进行 DCT 转换。
去掉相关联的数据后,我们可以看出数据被进一步压缩了。
做完 DCT 后,还不够,还要进行 CABAC 进行无损压缩。
CABAC
上面的帧内压缩是属于有损压缩技术。也就是说图像被压缩后,无法完全复原。而CABAC属于无损压缩技术。
无损压缩技术大家最熟悉的可能就是哈夫曼编码了,给高频的词一个短码,给低频词一个长码从而达到数据压缩的目的。MPEG-2中使用的VLC就是这种算法,我们以 A-Z 作为例子,A属于高频数据,Z属于低频数据。看看它是如何做的。
CABAC也是给高频数据短码,给低频数据长码。同时还会根据上下文相关性进行压缩,这种方式又比VLC高效很多。其效果如下:
现在将 A-Z 换成视频帧,它就成了下面的样子。
从上面这张图中明显可以看出采用 CACBA 的无损压缩方案要比 VLC 高效的多。
至此,我们就将H264的编码原理讲完了。本篇文章主要讲了以下以点内容:
-
简音介绍了H264中的一些基本概念。如I/P/B帧, GOP。
-
详细讲解了H264编码的基本原理,包括:
-
宏块的划分
-
图像分组
-
帧内压缩技术原理
-
帧间压缩技术原理。
-
DCT
-
CABAC压缩原理。
大家都知道要入门音视频要学习音视频录制,编码,处理,但是具体不知道怎么做。我自己在入门的时候也一样,靠着搜索引擎自己一点一点的积累,在这里当然要谢谢在该领域无私奉献的大佬们。
下面是我整理的学习路线,相信我,如果你认真学完了,你一定会成为音视频人才招聘市场的香饽饽~~
一、初级入门篇:
一、绘制图片
-
ImageView 绘制图片
-
SurfaceView 绘制图片
-
自定义 View 绘制图片
二、AudioRecord API详解
三、使用 AudioRecord 实现录音,并生成wav
-
创建一个AudioRecord对象
-
初始化一个buffer
-
开始录音
-
创建一个数据流,一边从AudioRecord中读取声音数据到初始化的buffer,一边将buffer中数据导入数据流。
-
关闭数据流
-
停止录音
四、用 AudioTrack 播放PCM音频
1.AudioTrack 基本使用
-
MODE_STATIC模式
-
MODE_STREAM模式
2.AudioTrack 详解
-
音频流的类型
-
Buffer分配和Frame的概念
-
AudioTrack构造过程
- AudioTrack 与 MediaPlayer 的对比
-
区别
-
联系
-
SoundPool
五、使用 Camera API 采集视频数据
1.预览 Camera 数据
2.取到 NV21 的数据回调
六、使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件
1.MediaExtractor API介绍
如何做好面试突击,规划学习方向?
面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。
学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。
同时我还搜集整理2020年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
roid的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。
学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。
同时我还搜集整理2020年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
[外链图片转存中…(img-3lmqHe4B-1643528031515)]
在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。
[外链图片转存中…(img-ZC5Il3Rz-1643528031516)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
以上是关于Android开发权威指南的图书目录的主要内容,如果未能解决你的问题,请参考以下文章
《Gradle权威指南》--Android Gradle高级自定义