2024全面拥抱AI

6 月 2 日
阅读 3 分钟
392
从去年年初大模型开始火了之后,最开始注册账号体验了下,后面就没有太用了,感觉没有诉求似的,老板们也在念叨,自己思维上一直在想如何让公司的业务和AI结合,结果想破脑袋也没有找个结合点,包括公司去年的一号项目最后也很鸡肋,我们在负责的业务探索了一个让AI帮助实现将语音输入的内容去口语化,以此降低语音输入...
封面图

从ChatGPT到AGI还有多远

6 月 2 日
阅读 7 分钟
372
21年开始在公司负责一个全链路语音的项目,支持公司的Iot设备,有点类似于市面上”小爱“、”小度“之类的音响,算是语音+语言在AI方向的综合应用,整体交互流程如下图:
封面图

2024年移动端技术探索

6 月 18 日
阅读 5 分钟
493
2023年号称AI元年,AI带来了一些不是很清晰的机会,没有看到有多好的落地,对于互联网,不止技术层面没有突破,业务层面的需求也断崖式下滑,没有创新就没有需求,老业务的修修补补也带不来多少需求。以音视频行业为例,业界很有影响力的LiveVideoStack也停止了商务活动,音视频大会也不再开了。一切都在朝着萎缩的方向...
封面图

TS文件结构解析

7 月 26 日
阅读 6 分钟
40
ts是日本高清摄像机拍摄下进行的封装格式,全称为MPEG2-TS。ts即"Transport Stream"的缩写。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。MPEG2-TS主要应用于实时传送的节目,比如实时广播的电视节目。
封面图

webrtc代码管理工具gclient入门

7 月 26 日
阅读 10 分钟
26
google的chromium项目是用gclient来管理源码的checkout, update等。 gclient是google专门为这种多源项目编写的脚本,它可以将多个源码管理系统中的代码放在一起管理。甚至包括将Git和svn代码放在一起。
封面图

MP4文件结构解析

7 月 25 日
阅读 4 分钟
106
目前MP4的概念被炒得很火,也很乱。最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准。随后MP4概念被转移到视频上,对应的是MPEG-4标准。而现在我们流行的叫法,多半是指能播放MPEG-4标准编码格式视频的播放器。但是这篇文章介绍的内容跟上面这些都无关,我们要讨论的是MP4文件封装格式,对应的标准为ISO/IEC 1449...
封面图

FLV格式解析

7 月 25 日
阅读 6 分钟
37
FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式。另外由于当前浏览器与Flash Player紧密的结合,使得网页播放FLV视频轻而易举,也是FLV流行的原因之一。
封面图

linux编译参数CPPFLAGS、CFLAGS、LDFLAGS的理解

7 月 24 日
阅读 2 分钟
218
linux编译参数CPPFLAGS、CFLAGS、LDFLAGS的理解编译步骤:CPPFLAGS : 预处理器需要的选项 如:-I (大写i指定头文件路径)CFLAGS:编译的时候使用的参数 –Wall –g -cLDFLAGS :链接库使用的选项 –L -l (大写L指定动态库的路径,小写L指定动态库的名称)CFLAGS 表示用于C编译器的选项CXXFLAGS 表示用于C++编译器的选项这两个...
封面图

C++11 promise介绍及使用

7 月 24 日
阅读 3 分钟
57
std::promise是C++11并发编程中常用的一个类,常配合std::future使用。其作用是在一个线程中保存一个类型typename T的值,可供绑定的std::future对象在另一线程中获取该值。
封面图

Android线程思考

7 月 23 日
阅读 6 分钟
80
在编程中我们经常遇到多线程相关的问题,记得刚工作的时候对线程没有太多概念,只知道new Thread()run函数中是新的线程,函数多调用几层,特别是一些别人的回调函数中,就忽略了线程引起的并发问题,产生了并发修改异常的崩溃。今天总结一些线程相关的知识。
封面图

C++11 chrono库详解

7 月 23 日
阅读 6 分钟
56
要使用chrono库,需要#include<chrono>,其所有实现均在std::chrono namespace下。注意标准库里面的每个命名空间代表了一个独立的概念。所以下文中的概念均以命名空间的名字表示! chrono是一个模版库,使用简单,功能强大,只需要理解三个概念:duration、time_point、clock
封面图

C++11 智能指针之shared_ptr

7 月 22 日
阅读 4 分钟
161
基于Alexa的全链路智能语音SDK基于C++实现了跨平台特性,跑通了Android、Mac、Linux等设备,在兼容iOS时发现iOS未提供音频采集和播放的C++接口,所以需要改造SDK,允许SDK初始化时注入外部的采集器和播放器实现类,同时SDK中的Android播放器是基于ffmpeg解码 + opensl实现,但是考虑到包体积的问题,准备也基于这个接口...
封面图

C++11 智能指针之shared_from_this

7 月 22 日
阅读 4 分钟
84
shared_ptr 作用:C++中采用new和delete来申请和释放内存,如果管理不当,很容易出现内存泄露;std::shared_ptr,std::unique_ptr,std::weak_ptr,三种智能指针类,可以自动管理内存使用示例:智能指针对象和一般的指针用法几乎完全相同 {代码...} 原理:只能指针包含两个成员变量:引用计数指针,管理对象的指针当引用计...
封面图

C++11 并发指南五(condition_variable 详解)

7 月 21 日
阅读 11 分钟
64
前面三讲《C++11 并发指南二(std::thread 详解)》,《C++11 并发指南三(std::mutex 详解)》分别介绍了 std::thread,std::mutex,std::future 等相关内容,相信读者对 C++11 中的多线程编程有了一个最基本的认识,本文将介绍 C++11 标准中 <condition_variable> 头文件里面的类和相关函数。

C++11 并发指南三(mutex详解)

7 月 21 日
阅读 5 分钟
74
Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文件中,所以如果你需要使用 std::mutex,就必须包含 <mutex> 头文件。
封面图

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

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

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

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

Android C++系列:Linux信号(三)

7 月 19 日
阅读 4 分钟
84
可重入函数不含全局变量和静态变量是可重入函数的一个要素可重入函数见man 7 signal在信号捕捉函数里应使用可重入函数在信号捕捉函数里禁止调用不可重入函数例如:strtok就是一个不可重入函数,因为strtok内部维护了一个内部静态指针,保存上一 次切割到的位置,如果信号的捕捉函数中也去调用strtok函数,则会造成切割字...
封面图

Android C++系列:Linux信号(二)

7 月 19 日
阅读 3 分钟
88
如果在进程解除对某信号的阻塞之前这种信号产生过多次,将如何处理?POSIX.1允 许系统递送该信号一次或多次。Linux是这样实现的:常规信号在递达之前产生多次只 计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。本文不讨论实时信 号。每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少 次,阻...
封面图

Android C++系列:Linux信号(一)

7 月 18 日
阅读 4 分钟
86
信号的概念信号的编号kill -l {代码...} 信号机制man 7 signal {代码...} First the signals described in the original POSIX.1-1990 standard. {代码...} 表中第一列是各信号的宏定义名称,第二列是各信号的编号,第三列是默认处理动作:Term表示终止当前进程;Core表示终止当前进程并且Core Dump(Core Dump 用于gdb调...
封面图

Android C++系列:Linux线程(四)线程同步

7 月 18 日
阅读 9 分钟
88
多个线程同时访问共享数据时可能会冲突,这跟我们前面信号文章所说的可重入性是同样的问题。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成:
封面图

Android C++系列:Linux线程(三)线程属性

7 月 17 日
阅读 5 分钟
105
linux下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问 题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。
封面图

Android C++系列:Linux线程(二)线程原语

7 月 17 日
阅读 5 分钟
85
void *arg:指定线程将要加载调用的那个函数的参数 返回值:成功返回0,失败返回错误号。之前介绍的系统函数都是成功返回0,失败返回-1,而错误号保存在全局变 量errno中,而pthread库的函数都是通过返回值返回错误号,虽然每个线程也都有一个errno,但这是为了兼容其 它函数接口而提供的,pthread库本身并不使用它,通过...
封面图

Android C++系列:Linux线程(一)概念

7 月 16 日
阅读 1 分钟
74
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kern...
封面图

Android C++系列:Linux文件IO操作(二)

7 月 16 日
阅读 7 分钟
79
注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写 位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。比如用fgetc读一个字节,fgetc有可能从内核中预读1024个字节到I/O缓冲区中,再返回第一 个字节,这时该文件在内核中记录的读写位置是1024,而在FILE结构体中记录的读...
封面图

Android C++系列:Linux文件IO操作(一)

7 月 15 日
阅读 3 分钟
62
事实上Unbuffered I/O这个名词是有些误导的,虽然write系统调用位于C标准库I/O缓 冲区的底层,但在write的底层也可以分配一个内核I/O缓冲区,所以write也不一定是直接 写到文件的,也可能写到内核I/O缓冲区中,至于究竟写到了文件中还是内核缓冲区中对于 进程来说是没有差别的,如果进程A和进程B打开同一文件,进程A写到...
封面图

Android C++系列:Linux文件系统(二)

7 月 15 日
阅读 6 分钟
70
Linux支持各种各样的文件系统格式,如ext2、ext3、reiserfs、FAT、NTFS、iso9660 等等,不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式,然而这些文件系统 都可以mount到某个目录下,使我们看到一个统一的目录树,各种文件系统上的目录和文件 我们用ls命令看起来是一样的,读写操作用起来也都是一样的,这是...
封面图

Android C++系列:Linux文件系统(一)

7 月 14 日
阅读 3 分钟
59
我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种 mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写 一些管理存储布局的信息。上图是一个磁盘分区格式化成ext2文件系统后的存储布局。
封面图

Android C++系列:Linux网络(五)常见术语

7 月 14 日
阅读 3 分钟
54
路由通常与桥接来对比,在粗心的人看来,它们似乎完成的是同样的事。它们的主要区别在于桥接发生在OSI参考模型的第二层(数据链路层),而路由发生在第三层(网络层)。这一区别使二者在传递信息的过程中使用不同的信息,从而以不同的方式来完成其任务。
封面图

Android C++系列:Linux网络(四)TCP详解

7 月 13 日
阅读 5 分钟
75
这个图N多人都知道,它排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这 张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻 的认识, 不能只停留在一知半解之中。下面对这张图的11种状态详细解析一下,以便加强记忆!不过在这之前,先回顾一下TCP建立连接的三次握手过程,以及关闭连接的四...
封面图