Android C++系列:string最佳实践一

6 月 25 日
阅读 3 分钟
464
字符串拼接直接用+号既可,字符串比较实用equel方法,同时还提供了StringBuilder和StringBuffer可变的字符串。它们继承了同一个抽象的字符串父类:AbstractStringBuilder。

Android C++系列:JNI中发送Http网络请求

6 月 25 日
阅读 10 分钟
448
libcurl是一个免费和易于使用的客户端URL传输库,支持DICT, FILE, FTP, FTPS, GOPHER, gopers, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET和TFTP。libcurl支持SSL证书,HTTP POST, HTTP PUT, FTP上传,HTTP表单上传,代理,HTTP/2, HTTP/...
封面图

Android C++系列:C++最佳实践6 constexpr与decltype

6 月 24 日
阅读 2 分钟
284
上一篇介绍了const关键字,主要修饰变量,起到不可改变的常量作用。有一种值不会改变并且在编译过程就能得到计算结果的表达式我们称为常量表达式。
封面图

Android C++系列:C++最佳实践5const

6 月 24 日
阅读 3 分钟
306
在Java中我们定义常量通常用final static TYPE variableName = xxx来实现,在C语言中我们通常用预编译宏来实现:#define MAX 100,在C++中虽然我们仍可以使用预编译宏,但是已经不推荐这么干了。在Effective c++ 的条款1中:提到“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。而且有时候...
封面图

Android C++系列:C++最佳实践4多重继承与虚继承

6 月 23 日
阅读 3 分钟
282
Java和C++在语法层面比较的时候就不得不提到C++的多继承,我们知道Android是单继承,C++是多继承。在大型项目中不可避免的会用到多继承,本文分析C++多继承的一些特征。
封面图

Android C++系列:C++最佳实践3继承与访问控制

6 月 23 日
阅读 3 分钟
361
整个结构还是比较简单的,从类内部到本包到子类到外部包权限越来越小,比较好理解也比较好记忆。但是在C++中访问控制要复杂很多,因为不仅有属性和方法的访问控制,还有继承时的派生列表访问说明符。今天我们着重了解访问控制。
封面图

Android C++系列:C++最佳实践2抽象类

6 月 22 日
阅读 1 分钟
275
OOP面向对象程序设计的核心是数据抽象,继承和动态绑定。前面的文章我们介绍了使用virtual的虚类实现动态绑定的多态,有时候我们在做抽象时,对于抽象的实体不想让被人实例化,虚类没有这个功能,我们Java里面我们有抽象类,有接口来抽象一个实体的行为,而不允许被实例化,C++有没有这样的功能呢?C++怎么实现抽象类呢?
封面图

Android C++系列:C++最佳实践1虚函数

6 月 22 日
阅读 2 分钟
274
C++多态的核心技术基础就是虚函数,虚函数允许我们使用同样的基类指针调用同一个方法的不同实现版本。我们Android使用Java开发过程中,方法重写技术自动实现了多态,C++角度可能更繁琐一些,本文从Java程序员思维角度来阐述C++虚函数及开发过程一些准则。
封面图

Android C++系列:C++内存结构

6 月 21 日
阅读 11 分钟
283
1. Java内存区域划分在了解C++内存区域划分前,我们先了解下Java内存区域划分。作为Android开发,我们根据《Java虚拟机规范》知道Java虚拟机在执行java程序时,会将自己管理的内存划分为以下五个区域:方法区堆程序计数器虚拟机栈本地方法栈每个区域都有自己的用途,并且创建时间和销毁时间也不一样。1.1 方法区方法区是...

Android C++系列:C++11函数特殊特性

6 月 21 日
阅读 3 分钟
275
在Python中函数有默认参数等,在C++11中我们发现C++也支持了默认参数;还有C++特有的内联函数、constexpr函数等知识都有不少细节,本文对这些知识做详细介绍。
封面图

Android C++系列:数组在函数中注意事项

6 月 20 日
阅读 2 分钟
408
1. 背景数组作为函数形参传递的是数组首元素的地址本来是很简单的知识点,但是在具体使用中还会有一些坑需要注意。2. 数组做函数形参C++中数组有两个特殊的性质:不允许拷贝数组:我们不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值,所以我们不能以值传递的方式使用数组参数;使用数组时通常会...
封面图

Android C++系列:内存知识整理

6 月 20 日
阅读 30 分钟
391
在嵌入式系统中使用C++的一个常见问题是内存分配,即对new 和 delete 操作符的失控。具有讽刺意味的是,问题的根源却是C++对内存的管理非常的容易而且安全。具体地说,当一个对象被消除时,它的析构函数能够安全的释放所分配的内存。这当然是个好事情,但是这种使用的简单性使得程序员们过度使用new 和 delete,而不注意...
封面图

Android C++系列:函数知识知多少

6 月 19 日
阅读 1 分钟
368
1. 背景函数可以理解为功能的封装,很基础的功能单元,但是因为它虽然看似简单,但是里面涉及了不少知识点和技巧,我们花一篇文章来整理。2. 函数定义函数有以下几部分定义:返回类型函数名称形参列表函数体函数调用的形式是函数名(),函数调用过程涉及到控制权转移。函数体其实是一个语句块,语句块会涉及到作用域的问题...
封面图

Android C++系列:函数返回值注意事项

6 月 19 日
阅读 2 分钟
360
看是有return语句,但是只有循环中满足特定条件才能正常返回,如果找不到的话实际上是没有返回值。编译器可能能检测出这个错误,也可能检测不出来,要看编译器的实现,好在大部分情况编译器甚至IDE可以帮我们检测出来,但是如果不幸我们用了检测不出来的编译器,可能会在运行时发生未定义行为错误。
封面图

Mp3文件结构全解析(一)

6 月 18 日
阅读 13 分钟
434
MP3 文件是由帧(frame)构成的,帧是MP3 文件最小的组成单位。MP3的全称应为MPEG1 Layer-3 音频文件,MPEG(Moving Picture Experts Group) 在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG 音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer-1、Layer2、Lay...
封面图

谷歌基于信号特征的语音编码器Lyra Android实践

6 月 17 日
阅读 10 分钟
463
通过语音和视频通话与他人在线联系正日益成为日常生活的一部分。实时通信框架,如WebRTC,使这成为可能,依赖于有效的压缩技术,编解码器,编码(或解码)信号传输或存储。几十年来,编解码器一直是媒体应用的重要组成部分,它使需要带宽的应用程序能够有效地传输数据,并使人们期望在任何时间、任何地点都能实现高质量的...
封面图

高级视频编码器性能对比(H265、VP9、AV1)

6 月 17 日
阅读 3 分钟
954
目前在视频编解码器中,H264已经成为绝对的主流,被大部分设备、浏览器所支持。虽然有更先进的编码器推出,但是受限于推广速度和设备支持成本,一直未能成为主流。
封面图

Opus从入门到精通(十一)webrtc中opus的使用

6 月 16 日
阅读 2 分钟
559
WebRTC中默认是采用Opus编码,Opus编码是由silk编码和celt编码合并在一起,silk编码是由skype公司开源的一种语音编码,特别适合人声,适合于Voip语音通信。celt和mp3,aac类似,适合于传输音乐。
封面图

Opus从入门到精通(八)Opus编码基础之压缩编码

6 月 16 日
阅读 6 分钟
448
只有在保持信号质量的前提下,设法降低码率及数据量,才能使标准得到应用。而这种降低码率的过程,被称为压缩编码或新源编码.这节介绍一些基础的压缩编码思想与方法,为后面Opus语音编码做基础准备.压缩编码又可以分为无损压缩,有损压损,混合压缩无损压缩编码有:
封面图

Opus从入门到精通(七)Opus编码基础之认识声音

6 月 15 日
阅读 3 分钟
458
前面我们分析完Opus的编解码api使用,封装原理等,接下来我们准备分析Opus编码原理.Opus编码是一个复杂的工作,我们需要做一些基本铺垫,包括认识声音,压缩编码基础.认识音频有助于我们了解音频特征,不仅对语音有助于我们理解编码技术,同时在语音识别,TTS等场景提供帮助
封面图

Opus从入门到精通(五)OggOpus封装器全解析

6 月 15 日
阅读 19 分钟
466
针对上面的问题我们可以自定义一种封装格式,增加类似于WAV的Header,Header中存储元数据,每一帧音频数据前面增加可以标识帧边界的头,但是又会引出其他问题:
封面图

Opus从入门到精通(四)Opus解码程序实现

6 月 14 日
阅读 2 分钟
454
由于我们解码后的数据直接写入文件,无法通过vlc等播放器播放,我们通过lame将解码后的数据再编码成mp3,当然,你要乐意也可以直接价格wav头输出成wav.通过采样率,声道数等创建lame编码器:
封面图

Opus从入门到精通(三)手撸一个Opus编码程序

6 月 14 日
阅读 18 分钟
533
编码是我们对脉冲编码调制(Pulse Code Modulation,PCM)的数据进行压缩操作,我们通常通过操作系统麦克风API获取PCM数据,或者从存储的现成的文件的PCM数据:
封面图

Opus从入门到精通(二)编解码器使用

6 月 13 日
阅读 48 分钟
726
Opus官方编码器实现,包括:Opus EncoderOpus DecoderRepacketizerOpus Multistream APIOpus library information functionsOpus Custom编解码示例文件:[链接]文档地址:[链接]编码器类型定义typedef struct OpusEncoder OpusEncoder //Opus encoder 状态.函数Function说明int opus_encoder_get_size (int channels)获得 Op...
封面图

Opus从入门到精通(一)简介

6 月 13 日
阅读 1 分钟
617
Opus编解码器是专门设计用于互联网的交互式语音和音频传输。它是由IETF的编解码器工作组设计的,合并了Skype的SILK和Xiph. Org的CELT技术。
封面图

深入理解rtmp(四)之协议实现分析

6 月 12 日
阅读 40 分钟
417
深入理解rtmp(三)之手把手实现握手协议根据我们第二篇深入理解rtmp(二)之C++脚手架搭建中接口封装流程:接下来要实现connect,createStream,play,..,为了效率和篇幅,我们直接分析srs-librtmp的实现.srs-librtmp是从srs作者为srs服务实现的客户端库(The client library srs-librtmp of SRS),其实不止客户端,也实现了一个简...
封面图

深入理解rtmp(三)之手把手实现握手协议

6 月 12 日
阅读 15 分钟
547
要建立一个有效的RTMP Connection链接,首先要“握手”:客户端要向服务器发送C0,C1,C2(按序)三个chunk,服务器向客户端发送S0,S1,S2(按序)三个chunk,然后才能进行有效的信息传输。RTMP协议本身并没有规定这6个Message的具体传输顺序,但RTMP协议的实现者需要保证这几点如下:
封面图

深入理解rtmp(二)之C++脚手架搭建

6 月 11 日
阅读 19 分钟
430
前面深入理解rtmp(1)之开发环境搭建中我们已经搭建好服务器,并且利用一些现成的工具可以推送直播流,播放直播流了.这篇文章我们开始搭建从零开发一套rtmp推流拉流sdk,对着协议实现,达到真正的"深入理解".
封面图

深入理解rtmp(一)之开发环境搭建

6 月 11 日
阅读 5 分钟
435
手机直播在15年的时候突然火起来,随着花椒,映客等出现,直播一下就出现在了风口,各个公司针对直播的战斗迅速打响,战斗过程比较短暂,随着许多公司的退出和死去,手机直播行业趋于稳定,直播服务时长也被传统的CDN厂商牢牢占据,后面大家又把精力投入到互动直播上面,当时一下对手机直播失去了信心.现在随着5G时代的到来,VR技术...
封面图

Android TTS语音播报实践

6 月 10 日
阅读 8 分钟
865
在工作中遇到了语音播报的需求,在收到push后,用语音播报push携带的播报内容。类似于微信支付宝的收款信息一样。调研后主要的语音播报方案有一下几种:
封面图