- 博客(37)
- 资源 (1)
- 收藏
- 关注
原创 Android音视频开发(3)MediaPlayer运行过程
这篇博客主要讲一下音视频开发过程中MediaPlayer的一整个创建以及运行的过程,主要以代码进行详解。1.从创建到setDisplay的过程当外部调用MediaPlayer.create(this,“ ”)时,以下是其创建过程的代码: 3 public static MediaPlayer creat(Context context,Uri uri,SurfaceHolder 4 holder,AudioAttributes audioAttributes,int a..
2021-10-23 17:16:01
2389
原创 Android音视频开发(2)常用的系统播放器MediaPlayer
1.状态图及生命周期MediaPlayer是一个多媒体播放类,通过它控制音视频流或本地音视频资源的播放过程。它分为很多状态,如下图所示:图中的单箭头弧代表同步函数调用,双箭头弧代表异步函数调用。1.1 Idle状态及End状态Idle就绪态:MediaPlayer创建实例或调用reset函数后,播放器被创建所处的状态。End结束态:调用release函数后,编程End状态。...
2021-10-21 11:00:08
2321
原创 音视频开发必备基本基础知识(1)
最近收到了朋友邮寄过来的一本书,刚拿回来就趁机学习了一波音视频开发的知识。现就音视频开发的一些基本知识做一个总结。如下:1.视频编码通过特定的压缩技术,将视频格式文件转换成另一种视频格式文件的方法。视频编码主要分为2个系列,分别如下:MPEG系列:ISO下属的MPEG,VCD(MPEG1),DVD(MPEG2)等H.26X系列:ITU(国际电传视讯联盟),侧重网络传输。2.音频编码AAC:专为声音数据设计的文件压缩格式。有损压缩格式MP3:是一种音频压缩技术。只保留能听到的低
2021-10-20 21:25:42
1439
原创 C++中经典面试问题(三大特征、隐藏、重载、覆盖,虚函数,异常,智能指针以及强制类型转等)
C++(面向对象)的三大特征:1.封装:将客观事物抽象成类,每个类对自身的数据和方法实行protected(保护),public(公有),private(私有)。2.继承:广义的继承有三种方式。实现继承、可视继承、接口继承。 实现继承:使用基类的属性和方法而无需额外编码的能力 可视继承:子窗体使用父窗体的外观和实现代码 接口继承:仅使用属性和方法实现之后到子类实现3.多态:是将父类对象设置成为一个或更多它的子对...
2021-08-08 22:27:41
432
原创 群体智能优化算法--烟花算法(附优化参数的通用代码)
烟花算法是由北京大学谭营教授提出了烟花算法。这是一种既简单又具有较强优化能力的算法。根据烟花爆炸的原理,每个烟花爆炸之后会选择最好的烟花作为下一次爆炸的烟花。而且在多个烟花爆炸的同时,每个烟花都是相互独立的,寻找最优爆炸烟花只在自身本身爆炸范围内寻找。该算法的鲁棒性体现在自身算法的特点上。适应度值的不同,会导致爆炸半径及产生烟火的数量不同,每个烟花个体之间是相互独立又是相互交流的,非常便捷。一、烟花算法组成爆炸烟花:烟花爆炸产生火花。在此过程中,主要包括了爆炸强度、爆炸幅度、位移操作...
2021-08-07 17:06:20
3235
原创 详细剖析linux的内存管理方式(分段式、分页式、段页式),以及进程状态的具体关系
进程状态之间的关系:1.分段式内存管理:分段:进程地址空间按照逻辑关系将自身划分为若干个段,每个段都有自己的段名,从0开始编址。内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段不相邻。组成:段号--段号的位数决定每个进程最多可分为几段。 段内地址--段内地址位数决定每个段最大长度是多少段表:一张映射表,是为了程序正常运行,从物理内存中找到逻辑段的存放位置。...
2021-08-03 22:00:43
1365
原创 Stack与queue的底层实现、区别。
一、stack(栈):先进后出1.栈是一种只能从表的一端存取数据且遵循 "先进后出" 原则的线性存储结构。栈的开口端被称为栈顶;相应地,封口端被称为栈底。 向栈中添加元素,此过程被称为"进栈"(入栈或压栈); 从栈中提取出指定元素,此过程被称为"出栈"(或弹栈);2.栈的实现顺序栈:采用顺序存储结构可以模拟栈存储数据的特点,从而实现栈存储结构;链栈:采用链式存储结构实现栈结构;3.接口使用stack(const contain...
2021-08-03 16:36:09
1381
原创 一文秒懂软链接与硬链接、dup、dup2函数。
dup、dup2实现文件描述符重定向dup函数:int dup(int oldfd);作用:返回一个新的文件描述符(最小可用文件描述符)newfd,且指向oldfd所指向的文件项。dup2函数:int dup2(int oldfd,int newfd);作用:返回一个最小可用文件描述符newfd,且newfd与传入的oldfd指向同一个表项;newfd若newfd已经被open过,那么就会先将newfd关闭,然后让newfd指向oldfd所指向的文件表项,如果newfd本身就等于o...
2021-08-02 16:41:46
274
原创 vector与list的接口介绍与如何使用以及区别,附代码。
一、vector向量(Vector)是一个封装了动态大小数组的顺序容器,它能够存放各种类型的对象。可认为向量是一个能够存放任意类型的动态数组。函数实现:1.构造函数:vector() 无参构造vector(size_type n, const value_type& val = value_type()) 构造并初始化n个valvector (const vector& x); 拷贝构造(只能拷贝同类型vector)vector (InputIterator firs
2021-08-02 15:22:59
274
原创 内存分布malloc/calloc/realloc/free/new/delete、内存泄露、String模板、浅拷贝与深拷贝以及模拟string类的实现
内存分布一、C语言中的动态内存管理方式:malloc/calloc/realloc和free1.malloc:从堆上获得指定字节的内存空间,函数声明:void *malloc (int n);函数执行成功,malloc返回获得内存空间的首地址;如果函数执行失败,那么返回值为NULL。通过malloc函数得到的堆内存必须使用memset函数来初始化。char *str = (char*) malloc(100);assert(str != nullptr);2.calloc
2021-08-02 09:34:53
342
原创 一文带你入门C++,类与对象、6个默认成员函数、this指针以及static关键字。
C++98关键字:63个一、命名空间规则(namespace) 1.命名空间可以解决函数、全局变量名重复的问题,包在不同的命名空间里的重复函数,实际就是两个完全无关的函数。 2.命名空间允许续嵌套:嵌套内部和外部没有任何关系。 3.命名空间允许重名:重名的命名空间就会被合并。注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。它解决了C语言中只能用文件划分作用域的缺点。命名空间使用有3种方式。 第1种:加命名空间名称...
2021-07-31 16:10:13
269
原创 高级IO--5种及select、poll、epoll的原理、执行以及优缺点
高级IO:5种典型的IO模型/多路转接模型---三种实现四种IO模型:阻塞IO/非阻塞IO/信号驱动IO/异步IOIO的过程:发起IO调用,等待IO条件就绪,然后将数据拷贝到缓冲区进行处理---等待/拷贝阻塞IO:为了完成IO,发起调用,若当前不具备IO条件,则一直等待类似于钓鱼,没有鱼上钩就一直等待.一个IO完毕后才能进行下一个,对于资源没有充分利用,大部分时间都在等待.非阻塞IO:完了完成IO,发起调用,若当前不具备IO条件,则立即返回(通常干其他事情需要循环操作重新..
2021-07-30 14:14:03
412
原创 带你一文搞懂网络层的IP协议\数据链路层的以太网\ARP协议以及DNS和NAT协议
TCP连接管理中的保活机制:TCP协议是面向连接通信,若通信双方长时间没有数据往来,就需要确定对方还是否在线,连接是否正常? 若通信双方长时间(7200秒)没有数据往来,在服务端会向客户端每隔一段时间(75秒)发送一个保活探测数据包,要求对方进行响应,若多次(9次)无响应,则认为连接断开.(时间都是可以配置的),连接断开对上层程序编写的影响:recv返回0/send触发异常网络层/链路层协议的解析:网络层:IP协议V--4位版本:IPV4/IPV6L-4位头部长度:I...
2021-07-28 14:59:48
778
原创 带你一文看懂MySqL中的事务与索引
子查询:在一条sql语句中嵌入在其他sql语句中的select语句,也叫嵌套查询 单行子查询:返回一行记录的子查询。 查询与“成绩优秀” 同学的同班同学:select * from student where classes_id=(select classes_id from student wherename='成绩优秀'); 多行子查询:返回多行记录的子查询(关键字IN和NOT IN)select * from score...
2021-07-27 20:58:51
122
原创 带你一文看懂--应用层、传输层的协议,HTTP协议及实现,UDP和TCP的报文格式以及为什么3次握手和4次挥手
网络基础:TCP/IP四层模型中的典型协议--理解网络通信的流程原理应用层协议:负责应用程序之间的数据沟通 网络版计算器:客户端向服务端传递两个数字以及一个运算符,服务端收到数据进行解析得到数字与运算符,然后进行运算,最终将结果返回给客户端int num1=10; int num2=20; char op="+";客户端需要将多个数据对象进行格式组织,然后通过网络数据传输,传递给服务端方案一:将3个数据对象组成成为一个字符串:“10;20+”方案二:将3个数据对象在...
2021-07-27 16:40:54
1035
原创 OSI七层、TCP/IP五层、UDP、TCP的socket编程(服务端及客户端)、字节序转换、多进程以及多线程服务端的实现
1.网络以覆盖范围划分:局域网/城域网/广域网 互联网/因特网 以太网/令牌环网--组网方式2.在网络中必须能够为一表示每一台主机,才能实现点到点的精确通信 IP地址: ipv4:uint32_t 无符号4个字节的整数 DHCP/NAT ipv6:uint_t addr[16];网络通信中的每条数据都必须具备:源IP地址/目的IP地址--表示数据从哪个主机来,到哪个主机去。 目的IP地址:能够让网络中的路由器为每一条数据根据目的地址选择不同的路...
2021-07-26 11:09:05
484
原创 Mysql库及表的基本概念、增删查改操作以及表的约束、多表联查
什么是数据库?存储数据的仓库数据库的存储介质:磁盘和内存。为什么要用数据库不用文件?(数据库与文件进行数据存储的区别)1.文件存储安全性低2.数据库对数据进行良好的存储,查询以及管理3.便于程序控制(C/S架构)关系型数据库:以行和列的形式组织(OLTP)联机事务处理 Oracle:甲骨文产品,适合大型项目,适合复杂业务逻辑,如ERP、OA等,收费 MySQL:甲骨文,不适合复杂业务,开源 ...
2021-07-25 21:16:28
214
原创 生产者消费者模型、信号量、线程池以及单例模式的实现
生产者消费者模型!!---对典型的应用场景设计的解决方案生产者与消费者模型应用场景:有线程不断的生产数据,有线程不断的处理数据。数据的生产与数据的处理:放在同一个线程中完成,因为执行流只有一个,那么肯定是生产一个处理一个,处理一个后才能生产一个,这样的话依赖关系太强---如果处理比较慢,也会拖的生产速度慢下来。因此将生产与处理放到不同的执行流中完成,中间增加一个数据缓冲区,作为中间的数据缓冲场所。生产者与消费者解决的问题:1.解耦和 (将各个功能分离)2.支持忙闲不均/3.支持并发.
2021-07-23 22:11:48
319
原创 线程安全、同步与互斥机制以及死锁的产生与实现
线程安全:多个执行流对临界资源争抢访问,但是不会出现数据二义性。线程安全的实现: 同步:通过条件判断保证对临界资源访问的合理性。 互斥:通过同一时间对临界资源访问的唯一性实现临界资源访问的安全性。同步如何实现?/互斥如何实现? 互斥的实现:互斥锁互斥锁实现互斥的原理:互斥锁本身是一个只有0/1的计数器,描述了一个临界资源当前的访问状态,所有执行流在访问临界资源都需要判断当前的临界资源状态是否允许访问,如果不允许则...
2021-07-22 17:06:00
244
原创 linux下的多线程
多线程:包括线程概念/线程控制/线程安全/线程基本应用多任务处理:多创建几个进程,一个进程就有一个pcb,能够串行化的完成一个任务,在一个进程中多创建几个pcb,pcb是调度程序运行的描述,有多少个pcb就有多少个执行流程,什么是线程?线程是一个进程内部的控制序列,线程是进程中的一条执行流,在linux下通过pcb实现,因此实际上linux下的线程就是一个pcb,并且linux下的pcb共用一个虚拟地址空间,相较于传统pcb更加轻量化,也被称之为轻量级进程。多线程是同时处理,只...
2021-07-21 15:33:16
418
原创 linux下的进程信号,信号注册、处理方式、注销,信号阻塞及volatile代码优化
信号量与信号的区别!信号量:内核中的一个计数器/实现进程间同步(条件判断合理性)与互斥(同一时间唯一访问安全性)。信号:进程之间事件异步通知的一种方式,是一种软中断,非信号量。作用:操作系统通过信号告诉进程发生了某个事件,打断进程当前的操作,去处理这个事件。通过kill -l命令查看系统中的信号种类-62种。1~31号信号:从unix借鉴来,每个信号都有具体对应的系统事件,---非可靠信号(可能丢失-事件丢失)34~64号信号:后期扩充,没有具体事件,---可靠信号(不会丢失)信
2021-07-20 14:54:11
317
原创 linux下的进程间通信-管道及共享内存
进程间通信(IPC):操作系统为用户提供的集中进程间通信方式;为什么要进程间通信?进程之间具有独立性(每个进程有自己的虚拟地址空间),访问自己的虚拟地址,无法访问同一块区域,因此无法实现数据通信。针对不同的通信场景提供多种通信方式:数据传输-管道/消息队列;数据共享-共享内存;进程控制-信号量。管道:本质:内核中的一块缓冲区;多个进程若访问同一个管道(一块缓冲区)可实现通信;种类:匿名管道/命名管道匿名管道:内核中的缓冲区没有具体的标识符;只能用于亲缘关系的进程间通信; ...
2021-07-16 15:12:26
259
原创 minishell的实现及IO接口的调用
Minishell编写:问题:二维数组使用上还是和指针数组有很大差别。运行结果如下:基础IO:文件的输入输出操作—标准库IO接口/linux下系统调用IO接口/文件描述符的理解/重定向的理解/文件系统/库文件标准库的IO接口:fopen/fwrite/fread/fseek/fclose stdin/stdout/stderrFILE *fopen(char *filename,char *mode);(文件名称,打开方式)打开方式:“r-只读 r+- 读写 ...
2021-07-15 16:52:44
201
原创 子进程获取、进程程序替换原理及实现
进程终止:退出一个进程在main函数中return退出 –退出前会刷新缓冲区 调用库函数exit() --退出前会刷新缓冲区 调用系统调用接口_exit() --退出时直接释放资源 退出场景:正常退出,自己主动退出/异常退出(ctrl+c)进程等待:等待子进程退出,获取子进程返回值,释放子进程资源,避免产生僵尸进程pid_t wait(int *status) --阻塞等待任意一个子进程的退出,获取返回值 pid_t waitpid(int pid, int *sta...
2021-07-13 20:29:14
449
原创 虚拟地址空间及内存管理方式
程序地址空间:进程的虚拟地址空间1.通过代码演示两个进程中变量地址相同,但是数据不同---进程中访问的地址都是虚拟地址2.虚拟地址空间:操作系统向进程通过mm_struct结构体描述的一个虚假的,线性的地址空间(空有地址编号,不具备存储)虚拟地址空间,可以让进程依然使用连续的虚拟地址,通过页表映射之后,实现数据在物理内存上的里三十存储,提高内存利用率。每个进程都有一个虚拟地址空间,有一个页表,通过页表可实现内存访问控制--进一步提高进程的独立性。操作系统通过虚拟地址空间,给每一个进.
2021-07-12 19:44:24
1545
原创 总结-linux初识进程(包括cpu调度、进程创建、僵尸进程(重点)、环境变量)
冯诺依曼体系结构--现代计算机的硬件体系结构 输入设备、输出设备(数据输出)、存储器(数据缓冲)、运算器(数据运算)、控制器。 所有设备都是围绕存储器工作---CPU是从存储器中获取数据处理---控制器是从存储器中获取数据输出 存储器实际上是内存,为什么不是硬盘呢?--->因为硬盘的数据吞吐量太低了:机械--200MB/s ...
2021-03-12 15:09:00
217
原创 总结-最全linux工具的使用
常用工具:1、 软件包管理工具2、编辑器3、编译器4、调试器5、项目自动化构建工具6、项目版本管理工具软件包管理工具:安装其他的软件工具。yum-类似于手机的应用商店。提供软件包的查看、安装、移除等管理操作三板斧操作:查看:所有软件包:yum list,yum srarch–搜索指定软件包,yum makecache将软件包信息保存到本地。安装:1.su root管理员权限。yum install–安装软件包卸载:1.su root管理员权限。yum remove–卸载软件包安装
2021-03-10 18:54:50
96
原创 总结-Linux基础指令
虚拟机桥接模式:需要连接wifi或网络 NAT模式:只要你电脑能联网,虚拟机使用主机上网。基础指令:ifconfig---查看网卡信息(IP地址)命令使用格式: 命令名称 [操作选项] [操作对象]一切皆文件:linux下所有东西都是文件,通过操作文件方式进行访问,目录也是文件。目录的命令:ls选项:浏览目录文件信息---当前用户(主机登录用户)家目录(操作系统为每个用户单独创建的目录) ls-a选项:浏览目录下所有文件(包...
2021-03-09 16:36:10
101
原创 Linux下关于gcc、vim、readelf、rpm、yum、彩色进度条的问题
一.vimvim厉害的原因:1.支持非常丰富的快捷键。2.支持非常丰富的扩展功能。vim的竞争对手:1.emacs(2000年之前)2.notepad ++/notepadplus/ue/sourece insight(2000-2010)3.(2010年左右)Sublime text (缺点:收费闭源) a)界面长得好看 b)支持vim风格的快捷键...
2019-11-04 19:25:19
336
原创 linux关于权限、目录、重要的指令以及如何使用包管理器
一、进入目录需要哪些权限, 在目录中执行增删查(cd, touch, ls, rm, mv等)改文件动作, 需要哪些权限.Linux的基本权限:r(读)/w(写)/x(可执行)1.权限 a.可读:可以读出文件中的内容 b.可写:可以修改文件中的内容 c.可执行:表示这个文件具有可执行权限,但是时候能真的执行,取决于文件的内容 文件夹 a.可读:缺失可...
2019-11-04 18:53:18
136
原创 Linux的常用指令
1. 将之前所创建的目录和文件全部清理掉2. 在家目录下创建 ~/workspace/cmd 目录以及 ~/workspace/tmp/test 目录(什么是家目录?)3. 进入 ~/workspace/cmd 目录,创建一个空文件my.txt4. 使用重定向>>与echo命令向my.txt文件写入 hello world 数据5. 将my.txt复制一份到~/worksp...
2019-11-04 18:07:59
126
原创 求0-999之间的水仙花数。
1.输出*图形。代码如下:#include <stdio.h>int main(){ int i = 1; int j = 1; for (i = 1; i <= 30; i += 2){ if (i <= 15){ for (j = 1; j <= i; j++){ printf("*"); } printf("\...
2019-05-05 16:16:39
234
原创 练手
2个数组内容进行交换,数组空间一样大。#include <stdio.h>#include <stdlib.h>void main(){ int i,tmp; char arr1[5] = { 0,1,2,3,4 }; char arr2[5] = { 9,8,7,6,5 }; for (i = 0; i < 5; i++){...
2019-05-05 15:48:32
120
原创 前置++与后置++的要点分析
前置++和后置++,都是自增1,但是表达式返回值不同。执行效率上前置++更快。前置++返回是自增之后的值。等价于num+=1; rerurn num;后置++返回的是自增之前的值。等价于 int tmp = num; num +=1; return tmp;1.计算任意一阶的阶乘。#inc...
2019-03-29 16:23:49
354
原创 今日初学C语言写的几个程序。
给定两个整型变量,交换两个整型变量的内容输出最终值。#include <stdio.h>#include <stdlib.h>int global = 2019; int main () { int a = 0; int b = 0; int c = 0; scanf("%d %d",&a,&b); c = a ; ...
2019-03-20 17:32:12
122
原创 C语言中全局变量和局部变量,作用域与生命周期的相关问题。
C语言中变量分为局部变量和全局变量;在程序的开头定义的是全局变量,在函数内部定义的是局部变量。在这里涉及2个概念,作用域与生命周期。作用域指的是描述变量在哪段代码中有效;生命周期指的是变量什么时候被创建,什么时候被释放。特别注意的是当全局变量和局部变量同名时,优先使用的是局部变量。#include <stdio.h>#include <stdlib.h&g...
2019-03-18 14:54:45
5655
原创 如何用C语言判断某一年是平年或者闰年?
如何用C语言判断某一年是平年或者闰年?#include <stdio.h>#include <stdlib.h>#define _CRT_SECURE_NO_WARNINGS int main () { int year; printf("请输入年份:\n"); scanf("%d",&year); if(year % 400==0)...
2019-03-18 14:22:18
8486
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人