Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions AudioVideo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Audio/Video 杂记

- [通用视频解码播放流程](通用视频解码播放流程.md)

73 changes: 73 additions & 0 deletions AudioVideo/SDL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
typora-copy-images-to: ./image
---

## SDL

### 简介

SDL(Simple DirectMedia Layer)库的作用就是封装了复杂的音视频底层交互工作,简化了音视频处理的难度。

**特点:** 开源、跨平台。

### 结构

![SDL结构](image/SDL结构.png)

它是对底层进行了封装,最终还是调用的平台底层接口与硬件进行交互。

### SDL 流程

![SDL流程](image/SDL流程.jpg)

### SDL 主要函数

| 函数 | 简介 |
| -------------------- | -------------------------- |
| SDL_Init() | 初始化 SDL 系统。 |
| SDL_CreateWindow() | 创建窗口 SDL_Window。 |
| SDL_CreateRenderer() | 创建渲染器 SDL_Renderer。 |
| SDL_CreateTexture() | 创建纹理 SDL_Texture。 |
| SDL_UpdateTexture() | 设置纹理数据。 |
| SDL_RenderCopy() | 将纹理的数据拷贝给渲染器。 |
| SDL_RenderPresent() | 显示。 |
| SDL_Delay() | 工具函数,用于延时。 |
| SDL_Quit() | 退出 SDL 系统。 |

### SDL 数据结构

![SDL数据结构](image/SDL数据结构.jpg)

**数据结构简介:**

| 结构 | 简介 |
| ------------ | -------------------- |
| SDL_Window | 代表一个“窗口”。 |
| SDL_Renderer | 代表一个“渲染器”。 |
| SDL_Texture | 代表一个“纹理”。 |
| SDL_Rect | 一个简单的矩形结构。 |

### SDL 事件和多线程

#### **SDL 多线程**

| 函数 | 简介 |
| ------------------ | -------------- |
| SDL_CreateThread() | 创建一个线程。 |
| SDL_Thread() | 线程的句柄。 |

#### **SDL 事件**

**函数:**

| 函数 | 简介 |
| --------------- | -------------- |
| SDL_WaitEvent() | 等待一个事件。 |
| SDL_PushEvent() | 发送一个事件。 |

**数据结构:**

| 结构 | 简介 |
| ----------- | -------------- |
| SDL_Event() | 代表一个事件。 |

Binary file added AudioVideo/image/SDL数据结构.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AudioVideo/image/SDL流程.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AudioVideo/image/SDL结构.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions AudioVideo/image/视频解码播放流程.gliffy

Large diffs are not rendered by default.

Binary file added AudioVideo/image/视频解码播放流程.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
28 changes: 28 additions & 0 deletions AudioVideo/常见封装格式.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
## 常见封装格式

封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。现如今流行的封装格式如下表所示:

主要封装格式一览

| 名称 | 推出机构 | 流媒体 | 支持的视频编码 | 支持的音频编码 | 目前使用领域 |
| ---- | ------------------ | ---- | ----------------------------- | ------------------------------------ | --------- |
| AVI | Microsoft Inc. | 不支持 | 几乎所有格式 | 几乎所有格式 | BT下载影视 |
| MP4 | MPEG | 支持 | MPEG-2, MPEG-4, H.264, H.263等 | AAC, MPEG-1 Layers I, II, III, AC-3等 | 互联网视频网站 |
| TS | MPEG | 支持 | MPEG-1, MPEG-2, MPEG-4, H.264 | MPEG-1 Layers I, II, III, AAC, | IPTV,数字电视 |
| FLV | Adobe Inc. | 支持 | Sorenson, VP6, H.264 | MP3, ADPCM, Linear PCM, AAC等 | 互联网视频网站 |
| MKV | CoreCodec Inc. | 支持 | 几乎所有格式 | 几乎所有格式 | 互联网视频网站 |
| RMVB | Real Networks Inc. | 支持 | RealVideo 8, 9, 10 | AAC, Cook Codec, RealAudio Lossless | BT下载影视 |

由表可见,除了AVI之外,其他封装格式都支持流媒体,即可以“边下边播”。有些格式更“万能”一些,支持的视音频编码标准多一些,比如MKV。而有些格式则支持的相对比较少,比如说RMVB。

这些封装格式都有相关的文档,在这里就不一一例举了。

我自己也做过辅助学习的小项目:

[TS封装格式分析器](http://blog.csdn.net/leixiaohua1020/article/details/17973587)

[FLV封装格式分析器](http://blog.csdn.net/leixiaohua1020/article/details/17934487)

### 参考资料:

[视音频编解码技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/18893769)
14 changes: 14 additions & 0 deletions AudioVideo/常见封装格式概览.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
## 常见封装格式概览

| 名称 | 推出机构 | 流媒体 | 支持的视频编码 | 支持的音频编码 | 目前使用领域 |
| ---- | ------------------ | ---- | ----------------------------- | ------------------------------------ | --------- |
| AVI | Microsoft Inc. | 不支持 | 几乎所有格式 | 几乎所有格式 | BT下载影视 |
| MP4 | MPEG | 支持 | MPEG-2, MPEG-4, H.264, H.263等 | AAC, MPEG-1 Layers I, II, III, AC-3等 | 互联网视频网站 |
| TS | MPEG | 支持 | MPEG-1, MPEG-2, MPEG-4, H.264 | MPEG-1 Layers I, II, III, AAC, | IPTV,数字电视 |
| FLV | Adobe Inc. | 支持 | Sorenson, VP6, H.264 | MP3, ADPCM, Linear PCM, AAC等 | 互联网视频网站 |
| MKV | CoreCodec Inc. | 支持 | 几乎所有格式 | 几乎所有格式 | 互联网视频网站 |
| RMVB | Real Networks Inc. | 支持 | RealVideo 8, 9, 10 | AAC, Cook Codec, RealAudio Lossless | BT下载影视 |

### 参考资料:

[视音频编解码技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/18893769)
33 changes: 33 additions & 0 deletions AudioVideo/常见流媒体协议.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
## 常见流媒体协议

流媒体协议是服务器与客户端之间通信遵循的规定。当前网络上主要的流媒体协议如表所示。

| 名称 | 推出机构 | 传输层协议 | 客户端 | 目前使用领域 |
| -------- | -------------- | ------- | -------- | -------- |
| RTSP+RTP | IETF | TCP+UDP | VLC, WMP | IPTV |
| RTMP | Adobe Inc. | TCP | Flash | 互联网直播 |
| RTMFP | Adobe Inc. | UDP | Flash | 互联网直播 |
| MMS | Microsoft Inc. | TCP/UDP | WMP | 互联网直播+点播 |
| HTTP | WWW+IETF | TCP | Flash | 互联网点播 |

RTSP+RTP经常用于IPTV领域。因为其采用UDP传输视音频,支持组播,效率较高。但其缺点是网络不好的情况下可能会丢包,影响视频观看质量。因而围绕IPTV的视频质量的研究还是挺多的。

RTSP规范可参考:[RTSP协议学习笔记](http://blog.csdn.net/leixiaohua1020/article/details/11955341)

RTSP+RTP系统中衡量服务质量可参考:[网络视频传输的服务质量(QoS)](http://blog.csdn.net/leixiaohua1020/article/details/11883393)

上海IPTV码流分析结果可参考:[IPTV视频码流分析](http://blog.csdn.net/leixiaohua1020/article/details/11846761)

因为互联网网络环境的不稳定性,RTSP+RTP较少用于互联网视音频传输。互联网视频服务通常采用TCP作为其流媒体的传输层协议,因而像RTMP,MMS,HTTP这类的协议广泛用于互联网视音频服务之中。这类协议不会发生丢包,因而保证了视频的质量,但是传输的效率会相对低一些。

此外RTMFP是一种比较新的流媒体协议,特点是支持P2P。

RTMP我做的研究相对多一些:比如[RTMP规范简单分析](http://blog.csdn.net/leixiaohua1020/article/details/11694129),或者[RTMP流媒体播放过程](http://blog.csdn.net/leixiaohua1020/article/details/11704355)

相关工具的源代码分析:[RTMPdump源代码分析 1: main()函数[系列文章\]](http://blog.csdn.net/leixiaohua1020/article/details/12952977)

RTMP协议学习:[RTMP流媒体技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/15814587)

### 参考资料:

[视音频编解码技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/18893769)
110 changes: 110 additions & 0 deletions AudioVideo/常见音视频编码.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
## 常见音视频编码

### 1. 视频编码

视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。

视频编码的简单原理可以参考:[视频压缩编码和音频压缩编码的基本原理](http://blog.csdn.net/leixiaohua1020/article/details/28114081)

注:视频编码技术在整个视音频技术中应该是最复杂的技术。如果没有基础的话,可以先买一些书看一下原理,比如说《现代电视原理》《数字电视广播原理与应用》(本科的课本)中的部分章节。

主要视频编码一览

| 名称 | 推出机构 | 推出时间 | 目前使用领域 |
| ----------- | -------------- | ---- | ------ |
| HEVC(H.265) | MPEG/ITU-T | 2013 | 研发中 |
| H.264 | MPEG/ITU-T | 2003 | 各个领域 |
| MPEG4 | MPEG | 2001 | 不温不火 |
| MPEG2 | MPEG | 1994 | 数字电视 |
| VP9 | Google | 2013 | 研发中 |
| VP8 | Google | 2008 | 不普及 |
| VC-1 | Microsoft Inc. | 2006 | 微软平台 |

由表可见,有两种视频编码方案是最新推出的:VP9和HEVC。目前这两种方案都处于研发阶段,还没有到达实用的程度。当前使用最多的视频编码方案就是H.264。

#### **1.1 主流编码标准**

H.264仅仅是一个编码标准,而不是一个具体的编码器,H.264只是给编码器的实现提供参照用的。

基于H.264标准的编码器还是很多的,究竟孰优孰劣?可参考:[MSU出品的 H.264编码器比较(2011.5)](http://blog.csdn.net/leixiaohua1020/article/details/12373947)

在学习视频编码的时候,可能会用到各种编码器(实际上就是一个exe文件),他们常用的编码命令可以参考:[各种视频编码器的命令行格式](http://blog.csdn.net/leixiaohua1020/article/details/11705495)

学习H.264最标准的源代码,就是其官方标准JM了。但是要注意,JM速度非常的慢,是无法用于实际的:[H.264参考软件JM12.2RC代码详细流程](http://blog.csdn.net/leixiaohua1020/article/details/11980219)

实际中使用最多的就是x264了,性能强悍(超过了很多商业编码器),而且开源。其基本教程网上极多,不再赘述。编码时候可参考:[x264编码指南——码率控制](http://blog.csdn.net/leixiaohua1020/article/details/12720135)。编码后统计值的含义:[X264输出的统计值的含义(X264 Stats Output)](http://blog.csdn.net/leixiaohua1020/article/details/11884559)

Google推出的VP8属于和H.264同一时代的标准。总体而言,VP8比H.264要稍微差一点。有一篇写的很好的VP8的介绍文章:[深入了解 VP8](http://blog.csdn.net/leixiaohua1020/article/details/12760173)。除了在技术领域,VP8和H.264在专利等方面也是打的不可开交,可参考文章:[WebM(VP8) vs H.264](http://blog.csdn.net/leixiaohua1020/article/details/12720237)

此外,我国还推出了自己的国产标准AVS,性能也不错,但目前比H.264还是要稍微逊色一点。不过感觉我国在视频编解码领域还算比较先进的,可参考:[视频编码国家标准AVS与H.264的比较(节选)](http://blog.csdn.net/leixiaohua1020/article/details/12851745)

近期又推出了AVS新一代的版本AVS+,具体的性能测试还没看过。不过据说AVS+得到了国家政策上非常强力的支持。

#### **1.2 下一代编码标准**

下一代的编解码标准就要数HEVC和VP9了。VP9是Google继VP8之后推出的新一代标准。VP9和HEVC相比,要稍微逊色一些。它们的对比可参考:(1)[HEVC与VP9编码效率对比](http://blog.csdn.net/leixiaohua1020/article/details/11713041) (2)[HEVC,VP9,x264性能对比](http://blog.csdn.net/leixiaohua1020/article/details/19014955)

HEVC在未来拥有很多大的优势,可参考:[HEVC将会取代H.264的原因](http://blog.csdn.net/leixiaohua1020/article/details/11844949)

学习HEVC最标准的源代码,就是其官方标准HM了。其速度比H.264的官方标准代码又慢了一大截,使用可参考:[HEVC学习—— HM的使用](http://blog.csdn.net/leixiaohua1020/article/details/12759297)

未来实际使用的HEVC开源编码器很有可能是x265,目前该项目还处于发展阶段,可参考:[x265(HEVC编码器,基于x264)](http://blog.csdn.net/leixiaohua1020/article/details/13991351)[介绍](http://blog.csdn.net/leixiaohua1020/article/details/13991351)。x265的使用可以参考:[HEVC(H.265)标准的编码器(x265,DivX265)试用](http://blog.csdn.net/leixiaohua1020/article/details/18861635)

主流以及下一代编码标准之间的比较可以参考文章:[视频编码方案之间的比较(HEVC,H.264,MPEG2等)](http://blog.csdn.net/leixiaohua1020/article/details/12237177)

此外,在码率一定的情况下,几种编码标准的比较可参考:[限制码率的视频编码标准比较(包括MPEG-2,H.263,MPEG-4,以及 H.264)](http://blog.csdn.net/leixiaohua1020/article/details/12851975)

结果大致是这样的:

HEVC > VP9 > H.264> VP8 > MPEG4 > H.263 > MPEG2。

截了一些图,可以比较直观的了解各种编码标准:

HEVC码流简析:[HEVC码流简单分析](http://blog.csdn.net/leixiaohua1020/article/details/11845069)

H.264码流简析:[H.264简单码流分析](http://blog.csdn.net/leixiaohua1020/article/details/11845625)

MPEG2码流简析:[MPEG2简单码流分析](http://blog.csdn.net/leixiaohua1020/article/details/11846185)

以上简析使用的工具:[视频码流分析工具](http://blog.csdn.net/leixiaohua1020/article/details/11845435)

我自己做的小工具: [H.264码流分析器](http://blog.csdn.net/leixiaohua1020/article/details/17933821)

### 2. 音频编码

音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。音频编码也是互联网视音频技术中一个重要的技术。但是一般情况下音频的数据量要远小于视频的数据量,因而即使使用稍微落后的音频编码标准,而导致音频数据量有所增加,也不会对视音频的总数据量产生太大的影响。高效率的音频编码在同等的码率下,可以获得更高的音质。

音频编码的简单原理可以参考:[视频压缩编码和音频压缩编码的基本原理](http://blog.csdn.net/leixiaohua1020/article/details/28114081)

主要音频编码一览

| 名称 | 推出机构 | 推出时间 | 目前使用领域 |
| ---- | -------------- | ---- | ------- |
| AAC | MPEG | 1997 | 各个领域(新) |
| AC-3 | Dolby Inc. | 1992 | 电影 |
| MP3 | MPEG | 1993 | 各个领域(旧) |
| WMA | Microsoft Inc. | 1999 | 微软平台 |

由表可见,近年来并未推出全新的音频编码方案,可见音频编码技术已经基本可以满足人们的需要。音频编码技术近期绝大部分的改动都是在MP3的继任者——AAC的基础上完成的。

这些编码标准之间的比较可以参考文章:[音频编码方案之间音质比较(AAC,MP3,WMA等)](http://blog.csdn.net/leixiaohua1020/article/details/11730661)

结果大致是这样的:

AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3

AAC格式的介绍:[AAC格式简介](http://blog.csdn.net/leixiaohua1020/article/details/11822537)

AAC几种不同版本之间的对比:[AAC规格(LC,HE,HEv2)及性能对比](http://blog.csdn.net/leixiaohua1020/article/details/11971419)

AAC专利方面的介绍:[AAC专利介绍](http://blog.csdn.net/leixiaohua1020/article/details/11854587)

此外杜比数字的编码标准也比较流行,但是貌似比最新的AAC稍为逊色:[AC-3技术综述](http://blog.csdn.net/leixiaohua1020/article/details/11822737)

我自己做的小工具:[ AAC格式分析器](http://blog.csdn.net/leixiaohua1020/article/details/18155549)



### 参考资料:

[视音频编解码技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/18893769)
18 changes: 18 additions & 0 deletions AudioVideo/通用视频解码播放流程.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
typora-copy-images-to: ./image
---

## 通用视频解码播放流程

**通用的网络视频播放流程:**

1. 从网络数据流中获得视频数据流。
2. 将视频数据流解析成压缩音频数据和压缩视频数据。
3. 分别对音频和视频解码获取原始(采样)数据。
4. 经过同步策略后,有序的将原始(采样)数据输出到指定设备播放。

![视频解码播放流程](image/视频解码播放流程.jpg)

### 参考资料:

[视音频编解码技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/18893769)
2 changes: 1 addition & 1 deletion CustomView/Advance/[01]CustomViewProcess.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

> 例如:制作一个支持自动加载网络图片的ImageView,制作图表等。

**PS: 自定义View在大多数情况下都有替代方案,利用图片或者组合动画来实现,但是使用后者可能会面临内存耗费过大,制作麻烦更诸多问题。**
**PS: 自定义View在大多数情况下都有替代方案,利用图片或者组合动画来实现,但是使用后者可能会面临内存耗费过大,制作麻烦等诸多问题。**

*******

Expand Down
20 changes: 10 additions & 10 deletions CustomView/Advance/[02]Canvas_BasicGraphics.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,22 +111,22 @@ Canvas我们可以称之为画布,能够在上面绘制各种东西,是安
******

### 绘制矩形:
确定一个矩形最少需要四个数据,就是**对角线的两个点**的坐标值,这里一般采用**左上角和右下角**的两个点的坐标。
我们都知道,确定一个矩形最少需要四个数据,就是**对角线的两个点**的坐标值,这里一般采用**左上角和右下角**的两个点的坐标。

关于绘制矩形,Canvas提供了三种重载方法,第一种就是提供**四个数值(矩形左上角和右下角两个点的坐标)来确定一个矩形**进行绘制。
其余两种是先将矩形封装为**Rect或RectF**(实际上仍然是用两个坐标点来确定的矩形),然后传递给Canvas绘制,如下:

``` java
// 第一种
canvas.drawRect(100,100,800,400,mPaint);
// 第一种
canvas.drawRect(100,100,800,400,mPaint);

// 第二种
Rect rect = new Rect(100,100,800,400);
canvas.drawRect(rect,mPaint);
// 第二种
Rect rect = new Rect(100,100,800,400);
canvas.drawRect(rect,mPaint);

// 第三种
RectF rectF = new RectF(100,100,800,400);
canvas.drawRect(rectF,mPaint);
// 第三种
RectF rectF = new RectF(100,100,800,400);
canvas.drawRect(rectF,mPaint);
```
以上三种方法所绘制出来的结果是完全一样的。

Expand Down Expand Up @@ -192,7 +192,7 @@ Canvas我们可以称之为画布,能够在上面绘制各种东西,是安
******

### 绘制椭圆:
相对于绘制圆角矩形,绘制椭圆就简单的多了,因为他只需要一个矩形矩形作为参数:
相对于绘制圆角矩形,绘制椭圆就简单的多了,因为他只需要一个矩形作为参数:

``` java
// 第一种
Expand Down
Loading