自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 问答 (1)
  • 收藏
  • 关注

原创 音视频处理 - 音频概念详解,码率,采样率,位深度,声道,编码

普遍认为,流畅且不失真的音频,要求采样率达到 40KHz 以上,这个采样率是人类听觉频率上限的两倍,一般 CD 品质音频的采样率是 44.1KHz,网络视频、视频文件一般是 48KHz。音频帧的播放是比较特别的,因为一帧音频包含的是一小段时间的音频采样,所以实际上音频帧的播放时间戳只是这一小段音频的开始播放时间,里面的采样数据会根据采样频率连续播放。采样率是采样的频率,与视频的帧率类似,是一秒钟对声音的采样个数,如果是双声道,那么 1 秒采样的个数是采样率的两倍,多声道同理。

2024-03-26 15:46:17 871

原创 Android_P_Audio_系统(2) — AudioTrack

1 AudioTrack 用例介绍AudioTrack 用于 Android 平台音频数据输出,属于 Audio 系统对外提供的 API 类,因此它在 Java 与 Native 层均有对应的源码实现。先从 Java 层的一个用例了解下 AudioTrack 工作流程。// 1 根据音频数据特征确定所要分配的缓存区的最小 sizeint bufsize = getMinBufferSize...

2019-10-16 14:31:47 1577 3

原创 使用 dlopen 和 dlsym 来使用 C++ 中的函数、类

1 问题简介正常情况下,dlopen 和 dlsym 是用来处理 C 库中的函数的,但对 C++ 来说,情况稍微复杂,如在 Android framework media 框架中加载 C++ 软解库组件时使用到 dlsym 来链接函数符号typedef SoftOMXComponent *(*CreateSoftOMXComponentFunc)( ...

2019-10-12 15:04:06 6730

原创 Android_P_Audio_系统(1) — Auido 系统简介

1 音频基础1.1 声音的三要素1. 音量(Volume)也叫做响度(Loudness),人耳对声音强弱的主观感觉就是响度,响度和声波振动的幅度有关。一般说来,声波振动幅度越大则响度也越大。当我们用较大的力量敲鼓时,鼓膜振动的幅度大,发出的声音响;轻轻敲鼓时,鼓膜振动的幅度小,发出的声音弱。2. 音调(Pitch)人耳对声音高低的感觉称为音调(也叫音频),音调主要与声波的频率有关。声波...

2019-09-30 10:43:27 2629

原创 图片 bmp 格式详解

1 概述BMP(Bitmap-File)图片文件格式,又称为 Bitmap (位图)或是 DIB(Device-Independent Device,设备无关位图),是 Windows 系统中广泛使用的图像文件格式。由于它可以不作任何变换的保存图像像素域的数据,因此成为我们取得 RAW 数据的重要来源。Windows 的图形用户界面(graphical user interfaces)也在它的...

2019-08-24 18:39:04 3281 1

原创 常见视频封装格式(3) — MP4

1 概述日常生活中,看到的视频文件的后缀名如 .mp4、.avi、.rmvb 都是属于视频文件的封装格式。所谓封装格式,就是以怎样的方式将视频轨、音频轨、字幕轨等信息组合在一起。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗或者一个锅,是用来盛放饭菜的容器。视频文件的封装格式并不影响视频的画质,影响视频画面质量的是视频的编码格式。下面介绍常见的视频封装格式 - MP4...

2019-07-08 11:32:07 3657

原创 常见视频封装格式(2) — TS

概述日常生活中,看到的视频文件的后缀名如 .mp4、.avi、.rmvb 都是属于视频文件的封装格式。所谓封装格式,就是以怎样的方式将视频轨、音频轨、字幕轨等信息组合在一起。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗或者一个锅,是用来盛放饭菜的容器。视频文件的封装格式并不影响视频的画质,影响视频画面质量的是视频的编码格式。下面介绍常见的视频封装格式 - TS。...

2019-06-29 20:15:34 13110 2

原创 常见视频封装格式(1) — AVI

-> 概述日常生活中,看到的视频文件的后缀名如 .mp4、.avi、.rmvb 都是属于视频文件的封装格式。所谓封装格式,就是以怎样的方式将视频轨、音频轨、字幕轨等信息组合在一起。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗或者一个锅,是用来盛放饭菜的容器。视频文件的封装格式并不影响视频的画质,影响视频画面质量的是视频的编码格式。下面介绍常见的视频封装格式 ...

2019-06-26 20:19:49 5280 1

原创 Android HIDL 之 hal 进程启动及服务注册过程

1. 引言前面章节 HAL 接口定义语言详解 中介绍了 HIDL 接口的设计架构,下面一节通过详解 Android 9.0 图形显示合成 Composer HAL 的启动与服务注册过程。我们知道,在 HIDL 的设计理念中,HAL 服务端进程与 frameworks 客户端调用是分离开的,每个 HAL 进程独立运行在自己的地址空间中,客户端通过 binder IPC 与 HAL 进程请求交互...

2019-04-10 08:53:18 14819

原创 Android HIDL HAL 接口定义语言详解

1. HIDL 概述在 Andoird 8.0 版本框架代码中,加入了 HIDL(HAL 接口定义语言),HIDL 的出现是为了将用户层和 HAL 层分割开,它指定了 HAL 和用户之间的接口,让用户能够替换 Android 框架,而无需重新编译 HAL,以便让厂商能够以更低的成本、更快速地将设备更新到新版 Android 版本中。通俗的来说,HIDL 设计了一套通过的框架接口,将 HAL 层...

2019-03-11 17:09:41 21535 6

原创 Android 系统 ANR 分析详解

什么是 ANRANR 产生的原因ANR 出现流程分析发生 ANR 如何定位如何避免和解决 ANR附 Google 官网说明链接:Keeping your app responsive1. 什么是 ANRANR:Application Not Responding,即应用无响应为用户在主线程长时间被阻塞Android 系统自身提供的一种检测机制-> ANR 的类型...

2019-03-08 10:30:32 6104 3

原创 android zygote 进程分析

1. 概述在 Android 系统中,所有的应用程序以及系统服务进程 SystemService 都是由 zygote 进程孕育 (fork) 出来的。创建 java 虚拟机,加载系统资源应用程序启动过程中负责 fork 出子进程在 Android 应用程序启动时,ActivityManagerService 会通过 socket 与 zygote 进程进行通信,请求它 fork 一个子进...

2019-02-28 16:35:58 623

原创 android HAL 硬件抽象层

1. 开发 Android 硬件抽象层1.1 HAL 层模块编写规范Android 系统的硬件抽象层以模块的形式来管理各个硬件访问接口。每一个硬件模块都对应有一个动态链接库文件。在系统内部,每一个硬件抽象层模块都使用结构体 hw_moudle_t 描述,而硬件设备则使用结构体 hw_device_t 来描述。下面分别描述硬件抽象层模块文件的命令规范以及结构体 hw_moudle_t 和 hw...

2019-02-28 16:34:14 1390

原创 android_9.0 MediaScanner 媒体扫描详解

1. 概述MediaScanner 是 Android 多媒体系统中重要的一员,MediaScanner 与媒体文件预扫描相关。我们知道,Android 系统每次开机或者重新插拔 SD 卡之后都会去扫描系统存储空间中的媒体文件,并将媒体文件相关的信息存储到媒体数据库中。这样后续 Gallery、Music、VideoPlayer 等应用便可以直接查询媒体数据库,根据需要提取信息做显示。如果进入...

2019-02-28 16:24:40 9690

原创 HLS 编解码协议详解

1 概述HTTP Live Streaming(HLS)是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。是苹果公司 QuickTime X 和 iPhone 软件系统的一部分。它的基本原理是在服务端把文件或媒体流分成许多小块的基于 HTTP 的文件或媒体流,客户端在播放码流时,可以根据自身的带宽及性能限制,在同一视频内容的不同码率的备用源中,选择合适码率的码流进行下载播放。在传输会话...

2019-02-14 20:41:55 3287

原创 理解 android 编译系统

前言Android 编译系统用来编译 Android 系统、Android_SDK 以及相关文档。该系统主要由编译文件(mk 文件)、Shell 脚本以及 Python 脚本组成,其中最主要的是 Make 文件众所周知,Android 是一个开源的操作系统。Android 的源码中包含了大量的开源项目以及许多的模块。不同产商的不同设备对于 Android 系统的定制都是不一样的。如何将这些项...

2019-01-31 10:45:29 966 1

原创 理解和使用 systrace

1. 概述systrace 是 android4.1 中新增的性能数据采集和分析工具,它可帮助开发者收集 Android 关键子系统(如 SurfaceFlinger、WindowManagerService、Framework关键模块、服务、View系统等)的运行信息,从而帮助开发者更直观的分析系统瓶颈,改进性能。systrace 允许你监视和跟踪 android 系统的行为,它会告诉你系统...

2019-01-31 09:32:50 2966

原创 开源 XmlParser expat 使用介绍

1. 概述expat 是使用 C 所写的 XML 解析器,采用流导向的方式(stream-oriented)解析 XML 文件,我们需要首先向解析器注册 callback 函数,在传入文档解析时,对于解析器能够识别的文档部分,它会调用适当的 callback 动作进行解析(在已注册的前提下)。被解析文档是分块传给解析器的,因此在你全部传入文档之前就已经开始解析了。expat 可以分析非常大的...

2019-01-24 19:46:16 2546

原创 Android P 系统新特性概述

1. 引言2018 年 3 月 8 日,谷歌发布了 Android P 的预览版,初步来看给感觉这次大版本似乎并没有什么改变。接下来,将从系统 Treble、System、Framework、Runtime、Security 等多方面来解读一下 Android P 的变化。2. Treble 计划Treble 计划是一个非常重要的变革,对系统层面的影响很大。Google 每发布一个 Andr...

2019-01-16 10:02:08 1926

原创 android_rockchip_jpeg_hw 硬解码 demo 实现

#include <stdio.h>#include <stdlib.h>#define LOG_TAG "JpegDecTest"#include <utils/Log.h>// jpeg_hw_dec_api_include#include "hw_jpegdecapi.h"#include "SkHwJpegUtility.h"#defi..

2018-12-22 17:27:06 1694 1

原创 常见视频原始数据格式分析 — RGB

1. RGB 简介1.1 RGB 色彩模式RGB 色彩模式是工业界的一种颜色标准,是通过对红®、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的。Red、Green、Blue 每一种颜色值的范围是 0~255,所以每一个颜色用 1 个字节 = 8 个 bit 便可完全在计算机内部表示出来。而 R、G、B 不同的组合几乎产生了所有的颜色,当然自然界中的颜色比这些...

2018-12-22 17:04:38 5917

原创 常见视频原始数据格式分析 — YUV

1. YUV 简介YUV 是比较常用的原始视频数据数据格式,视频采集芯片输出的码流大部分都是 YUV 数据流形式,而视频处理(如 H264、H265编码等),也是在原始 YUV 码流进行编码和解析。所以,了解熟悉 YUV 数据流对于做视频领域的人而言,至关重要。YUV,分为三个分量,Y:表示明亮度(Luminance 或 Luma),也就是灰度值;而 U 和 V :表示的则是色度(Chromi...

2018-12-22 10:22:46 6201 1

转载 linux 进程的虚拟内存

当我们创建一个进程时,我们知道进程有以下特点:每个进程都有自己独立的 4G 内存空间,各个进程的内存空间具有类似的结构一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据、代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的 task_struct 记录,task_struct 中记录中一条链表,记录中内存空间的分配情况,哪些地址有数据,哪些地址无数据,哪些可读,哪些...

2018-12-14 10:30:42 474

原创 c++: 内联函数

我们知道,函数封装调用有利于与代码的重复利用,因为我们可以函数起一个通俗易懂的名字,因此阅读和理解函数通常比读懂等价的条件表达式容易的多。然而函数相较于等价表达式运行速度要慢一些,因为在大多数机器上,一次函数调用意味着其实包含一系列的工作:调用前先保存寄存器,并在返回时恢复;可能需要拷贝实参;程序转向一个新的位置继续执行;内联函数的出现就是为了避免不必要的函数调用的开销,将函数定义为内联函数,...

2018-12-07 11:20:20 273

原创 理解音视频 I 帧 以及 (PTS 和 DTS)

视频视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程,就像在一个本子的每一页画上画,然后快速翻动的感觉。但是在实际应用中,并不是每一帧都是完整的画面,因为如果每一帧画面都是完整的图片,那么一个视频的体积就会很大,这样对于网络传输或者视频数据存储来说成本太高,所以通常会对视频流中的一部分画面进行压缩(编码)处理。由于压缩处理的方式不同,视频中的画面帧就分为了不同的类别,其中...

2018-11-22 20:45:08 1400

原创 Android 8.1 非系统进程设置系统域属性问题

1. 进程间通过设置属性进行交互Android 系统开发中经常需要通过属性在各个进程间传递信息,通过一个进程 set_property,另一个进程 get_property 达到进程间通信的需求。属性获取没有限制,但是如果需要进程可以进行设置属性操作,则需要做一些处理。因为在 init 进程属性设置处理过程中会进行 selinux 权限的检查,如果不通过的话,设置属性的请求会被拒绝。报错 f...

2018-11-07 11:47:16 12218 2

原创 do...while(0) 的妙用

在 C++ 中,有三种类型的循环语句:for、 while、 和 do…while, 但是在一般应用中作循环时, 我们可能用 for 和 while 要多一些,do…while 相对不受重视。但是,最近在读项目代码时,却发现了 do…while 的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。1. do…while(0) 消除 goto 语句通常,如果在一个函数中开始要...

2018-11-01 10:20:47 185

原创 H264 编解码协议详解

1.、什么是 H264?H264 是 MPEG-4 标准所定义的最新编码格式,同时也是技术含量最高、代表最新技术水平的视频编码格式之一,标准写法应该是H.264H264 视频格式是经过有损压缩的,但在技术上尽可能做的降低存储体积下获得较好图像质量和低带宽图像快速传输。2、一些相关名词解释下图为 H264 码流分层图2.1、VCL & NALH264 原始码流是由一个接一个 N...

2018-10-24 17:56:44 35225 4

原创 android 异步消息处理机制 — AHandler

1. 引入 ALooper、AHandler、AMessage在 android multimedia stagefright 的框架代码中,通篇都是这几个类的身影,所以熟悉 android 多媒体框架的第一步必须理解这几个类的含义。这几个类是为了实现异步消息机制而设计的,这里有两个概念 “异步” & “消息机制”,下面详细说明一下。同步和异步概念区别比较简单,可以举个例子说明:...

2018-10-09 11:20:16 1036

原创 linux 多线程之信号量 sem_init

1. 什么是信号量linux sem 信号量是一种特殊的变量,访问具有原子性, 用于解决进程或线程间共享资源引发的同步问题。用户态进程对 sem 信号量可以有以下两种操作:-> 等待信号量 当信号量值为 0 时,程序等待;当信号量值大于 0 时,信号量减 1,程序继续运行。-> 发送信号量 将信号量值加 1通过对信号量的控制,从而实现共享资源的顺序访问。2. 相关函...

2018-09-29 20:32:54 38253 5

原创 linux 内核 - ioctl 函数详解

1. 概念ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。在文件 I/O 中,ioctl 扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析 ioctl 函数。 2. 用户空间 ioctl#include &...

2018-09-14 10:32:55 164097 12

原创 c++11:对象移动 & 右值引用 & 移动构造函数

一、概述c++ 11 新标准中最主要的特征是可以移动而非拷贝对象的能力。很多情况下,对象拷贝后就会立即被销毁。 在这些情况下,移动而非拷贝对象会大幅度提升性能。在旧 C++ 标准中,没有直接的方法移动对象。因此,即使不必要拷贝对象的情况下,我们也不得不拷贝。如果对象本身要求分配内存,进行不必要的拷贝代价非常高。类似的,在旧版本的标准库中,容器所保存的类型必须是可拷贝的,但在新标准中,我们...

2018-09-10 16:05:49 736

原创 c++:类拷贝控制 - 拷贝构造函数 & 拷贝赋值运算符

一、拷贝控制当定义一个类时,我们可以显式或隐式地指定此类型的对象拷贝、移动、赋值和销毁时做什么。一个类可以通过定义五种特殊的成员函数来控制这些操作,包括:++拷贝构造函数++、++拷贝赋值函数++、++移动构造函数++、++移动复制函数++和++析构函数++。我们称这些操作为拷贝控制操作。拷贝构造函数和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么。拷贝赋值运算符和移...

2018-08-31 18:21:06 580

原创 c++11: 智能指针 shared_ptr & unique_ptr

一、背景1. 堆内存、栈内存、静态区内存我们知道,静态内存用来保存局部 static 对象、类 static 数据成员以及定义在函数之外的变量。而栈内存用来保存定义在函数内的非 static 对象。分配在静态区或栈内存中的对象由编译器自动创建和销毁,对于栈内存,仅在其定义的程序块运行时才存在,而 static 对象在使用之前分配,在程序结束时销毁。除了静态内存和栈内存,每个程序...

2018-08-29 17:16:18 2080

转载 c++:为什么要使用动态内存分配

实例化一个类有两种方式:// 假设有一个类A// 方式一:直接定义法A a;// 方式二:动态内存分配法A * a = new A();两者有什么差别呢? 实际上,方式二即等价于如下代码:A * a = new A();等价于A * a;a = new A();方式一就是直接将a放入栈区(局部变量,大小受限,自动释放); 方式二则是在堆区(动态内...

2018-08-29 14:59:45 6975 8

原创 android 8.1 属性服务源码详解

一、 概述我们知道,在 windows 平台中有一个叫注册表的东西,注册表可以存储一些类似 key/value 的键值对。一般来说,系统或某些应用程序会把自己的一些属性存储在注册表职工,即便系统重启或应用程序重启,它还能根据之前在注册表中设置的属性,进行相应的初始化工作。Android 平台提供了一个类似的机制,称之为属性服务(property service),应用程序可以通过这个属性机...

2018-08-27 17:16:22 3965 1

原创 Android 8.1 开机流程分析(2)

上一篇中讲了 init 进程启动的第一阶段,也就是 init 进程的内核态执行,主要包含的工作内容有: - 挂载分区 dev、system、vendor 等 - 创建设备节点及设备节点热插拔事件监听处理 (ueventd) - 创建一些关键目录、初始化日志输出系统 - 启用 SELinux 安全策略本章节的内容为 init 进程第二阶段执行的内容,也称为 init 进程的用户态执行。...

2018-08-24 11:23:39 3946 1

原创 linux 高并发事件触发处理 — epoll

1. 概述epoll 是在内核 2.6 中提出的,是之前 select 和 poll 的增强版本。 在 linux 的网络编程中,很长时间都在使用 select 来做事件触发。在 2.6 内核中,有一种替换它的机制,就是 epoll。select 与 epoll 区别概述(1) 实现在函数使用上epoll 使用一组函数来完成任务,而不是单个函数(2) 效率:select...

2018-08-22 14:35:43 13845 2

原创 valist:解决变参问题

1. 概述va_list 是在 C 语言中引入解决变参问题的一组宏,变参问题是指参数的个数不定或者每个参数的类型不同。头文件:#include <stdarg.h>2. 使用步骤va_list 是一个字符指针类型,在代码中可以理解成当前参数集的指针,下面是几个与 va_list 相关常见的函数1. typedef char* va_list;2. ...

2018-08-03 11:56:43 4257

原创 Android 8.1 开机流程分析(1)

1. 启动过程概述 图:android_boot_process学习任何软硬件系统,研究系统启动过程都是一种非常有效地起步手段。上面的这张图可以帮助理解 Android 系统的启动过程。(1) Boot ROM 阶段Android 设备上电后,首先会从处理器上 ROM 的启动引导代码开始执行,片上 ROM 会需找 Boot loader 的代码,并加载到内存中。这一步由”芯片...

2018-07-27 16:48:29 14571 8

空空如也

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

TA关注的人

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