自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ubuntu使用gparted工具扩容

在使用ubuntu的过程中,由于创建ubuntu系统时申请的空间比较少可能会导致ubuntu空间不足,影响使用;但是重新安装一个ubuntu又需要拷贝现有的资料,费时费力;现在分享一个使用gparted工具扩容的方法,方便以后的开发;提醒:再扩容前最好对ubuntu做备份,以免操作失误导致系统无法启动;

2025-03-30 15:32:36 801

原创 linux之时间服务器

在项目开发中,各个模块的时间同步是一个重要的机制;那么如何在linux上搭建时间服务器呢?并且客户端怎么与服务器进行时间同步呢?

2024-11-14 10:39:03 671

原创 QT下载与安装

下载过QT的都知道,网上好多方法都是无法下载的,需要注册,购买等;

2024-08-07 10:47:55 714

原创 c语言实现线程池,新手秒懂

其实,无限循环的线程基本不会添加到线程池中,线程池就是为了缓解频繁创建,销毁线程占用大量资源而创建的,而无限循环的线程不存在频繁创建和销毁所以就不需要线程池;添加进线程池的线程线存放在队列中,如果有空闲的执行线程,会被取走执行;如果把无限循环的线程添加到线程池,会一直占用线程池的执行线程,导致这个执行线程不能处理其他任务造成资源浪费;2.如果要求并发性,异步性,那么就需要运用线程,但是为了效率,就需要使用线程池来管理这些线程;初始化线程池信息结构体,创建执行数量的线程用于执行队列中的任务;

2024-07-24 11:13:40 574

原创 live555搭建实时播放rtsp服务器

createNewStreamSource函数是需要我们实现的函数,函数创建了H264FramedLiveSource类对象,这个类对象就是我们实现doGetNextFrame函数的类;当然live555源码的实现技巧,运行流程也是很值得借鉴的;live555可以说是rtsp的专项库,既可以搭建rtsp服务器,也可以搭建rtsp客户端;FramedSource类中只有一个doGetNextFrame纯虚函数,用于获取媒体流,其他不用实现;我是以帧的方式获取的视频流,在实际的开发中,不一定非要一次取一帧;

2024-07-19 09:36:01 2520 1

原创 live555 rtsp服务器实战之doGetNextFrame

注意:该篇文章可能有些绕,最好跟着文章追踪下源码,不了解源码可能就是天书;

2024-07-17 17:32:49 677

原创 live555 rtsp服务器实战之createNewStreamSource

live555用于实际项目开发时,createNewStreamSource和doGetNextFrame是必须要实现的两个虚函数,一般会创建两个类来实现这两个函数:假如这两个类为H264LiveVideoServerMediaSubssion和H264FramedLiveSource;H264LiveVideoServerMediaSubssion为实时视频会话类,用于实现createNewStreamSource虚函数;

2024-07-15 14:35:48 548

原创 live555关于RTSP协议交互流程

在构造函数中setBackgroundHandling会把客户端套接字fOurSocket和对应的处理函数incomingRequestHandler添加到闭环双链表中,在doEventLoop中循环遍历,客户端有信令交互就调用相关的处理函数;UDP流媒体传输服务器需要创建两个四个UDP套接字,用于传输音频RTP,音频RTCP,视频RTP,视频RTCP;该文档是以H264的传输为例所以只介绍视频RTP端口,视频RTCP端口的创建过程,音频类似;TCP流媒体传输使用的时信令交互的套接字,这里不做解释;

2024-07-13 16:37:52 978

原创 live555的核心数据结构值之闭环双向链表

描述:一个节点保存有前一个节点的地址和后一个节点的地址,并且最后一个节点的下一个节点地址指向第一个节点,第一个节点的前一个节点的地址指向最后一个节点;该链表的添加方式为头插法;

2024-06-27 10:12:43 536

原创 vscode linux项目插件global扩展安装

vscode经常用来编辑linux系统下的项目;但是经常出现一些小问题;例如代码导航:有时想要跳转到函数定义时会提示:未找到xxx的任何定义;更奇怪的是有的函数可以跳转有的函数不能跳转;理论上来说C/C++插件已经具备函数导航功能可是不知道为什么失效;遇到这种情况可以安装C/C++ GNU Global插件来解决。描述:提供使用 GNU Global 的 C/C++ 智能感知功能。插件描述上也描述了global的安装方法,不过在linux上安装与上述有所不同;

2024-06-24 17:36:08 989

原创 linux命令提示符设置

当然以上都是属于临时的设置;关机后就不存在;可以将export命令 保存到~/bashrc或者/etc/profile或者/etc/bash.bashrc等启动脚本中;每次启动都会进行配置;

2024-06-13 13:34:52 572

原创 ffmpeg实现媒体流解码

本期主要讲解怎么将MP4媒体流的视频解码为yuv,音频解码为pcm数据;在此之前我们要先了解解复用和复用的概念;解复用:像mp4是由音频和视频组成的(其他内容流除外);将MP4的流拆分成视频流(h264或h265等)和音频流(AAC或mp3等);复用:就是将音频和视频打包成MP4或者flv等这些媒体格式;因此要实现MP4媒体流的解码流程如下:代码分为四部分:打开输入文件,寻找视频解码器,寻找音频解码器,解码。

2024-03-24 16:46:19 915

原创 推荐一款很不错的vscode高亮插件

用过很多款高亮插件,总感觉大部分显示都很乱,但是其中有一款用起来很清晰明了,很喜欢!底色高亮让人感觉很清晰,一个好的高亮插件能让你快速了解程序的运行过程,让人舒畅!插件名字:select-highlight-cochineal-color。

2024-03-22 09:23:48 747

原创 ffmpeg 滤镜实现不同采样率多音频混音

音频混音在音视频开发中是十分重要的一个环节,所谓音频混音就是将所有需要混音的数据相加得到混音数据,然后通过某个算法进行非法数据的处理;例如相加数值超过最大值,最小值等!在实际的音频开发中,要实现混音的流程如下:因此我们的编码实现就分为五部分:寻找解码器,音频解码,混音,创建编码器,音频编码;

2024-03-17 16:14:37 1305

原创 ffmpeg之avformat_alloc_output_context2

功能:查找根据format_name或者filename或者oformat输出类型,并且初始化ctx结构。参数:ctx:AVFormatContext结构体,ffmpeg核心结构体,会在函数内部给ctx分配AVFormatContext空间并初始化。oformat:指定输出格式的 AVOutputFormat 结构体指针。可以使用 NULL,此时将根据 format_name 自动选择输出格式。

2024-02-20 19:32:12 1100

原创 linux 测试网络速率

ethtool是很强大的查询网卡(嵌入式称为phy芯片)配置的工具,几乎phy芯片芯片手册寄存器能配置的选项,ethtool都能查询到;phy芯片一般分为10base,100base,1000base;Speed: 1000Mb/s能说明网卡处于1000base模式,实际速率相差不多;就是当前网络的速率;这里的Speed: 1000Mb/s只能说明phy芯片最大速率能达到1000Mb/s;网络自适配是否打开,工作模式(全双工,半双工),速率等信息;phy芯片支持的端口,支持的链接模式;

2024-02-19 17:26:05 1590 2

原创 c语言实现内存池

所谓内存池,顾名思义和线程池的设计原理是一样的,为了减少频繁申请释放内存而带来的资源消耗,减少释放内存后产生的内存碎片。

2024-02-06 11:55:05 789 1

原创 linux互斥锁:递归锁,非递归锁用法详解

在实际的项目中经常涉及到共享资源,共享资源被多个线程访问会出现竞争现象;为了解决竞争和保护共享资源常用的机制之一就是互斥锁!互斥锁又分为递归锁和非递归锁,互斥锁默认是非递归锁,也是我们常用的上锁方式。那么什么是递归锁和非递归锁呢?

2024-02-04 15:20:45 636

原创 aiXcoder自动跳出

在使用vscode时突然提示:需登录aixcoder才可以继续使用;在设置里搜索自动更新:将Update:Mode项改为none即可继续使用,需要重启vscode。文件->首选项->设置;(最好在扩展里所有aixcoder,如果已经安装最好卸载掉)后面可能要收取费用,本着白嫖的宗旨思考:那么怎么恢复原来的版本呢?

2024-01-23 10:51:29 570

原创 linux信号处理机制

注意:SIGKILL和SIGSTOP这两个信号不在处理范围内,SIGKILL和SIGSTOP是两个特殊的信号,具有特殊的行为和权力。除了这种方式,还有一种操作信号集的方式更为精确,能够屏蔽,添加,删除,操作等某个信号。检查某个信号signum是否在信号集set中。将某个信号signum添加到信号集set。将某个信号signum从信号集中删除。set:用来存储信号集的值。set:用来存储信号集的值。signum:某个信号。signum:某个信号。signum:某个信号。成功:0,失败:-1。

2024-01-19 11:59:51 454

原创 vscode无法自动补全

扩展->c/c++->Intellisense,找到Intelli Sense Engine Fallback 或者直接在设置里搜Intelli Sense Engine Fallback,将该选项设置为enabled;c/c++插件功能非常强大,几乎能满足日常编码过程中常用的功能;前提:安装c/c++插件。完成后代码即可自动补全。

2024-01-13 16:29:23 3091

原创 linux tcpdump能抓到包但是应用程序不能收到包

tcpdump命令能抓到过来的数据包,可是应用程序的recvfrom等套接字接收函数无法接收数据包;原因可能是各种各样的;由于疏忽不用时没有关闭所有的套接字,导致套接字越来越多,系统和单个进程都是有文件描述符上限的;太多的文件描述符就会导致应用程序的recvfrom等套接字接收函数出现问题;在网络编程项目中会遇到各种各样的网络问题,原因往往是多种多样的,在网上不会找到一个满意的答案;由于我的项目中的另外一个进程:在使用某功能时会创建很多套接字(文件描述符);我的好像是五百多个文件描述符就出现这个问题。

2024-01-11 11:45:56 2158 1

原创 linux文件描述符管理

在实际的项目开发中,文件描述符是经常用到的并且在释放资源过程中也是很容易忽略的,使用之后不释放就会增加cpu负担,无异于内存泄漏;所以时刻掌握文件描述符的状态是非常重要的!下面介绍文件描述符的管理方法。这个命令会输出三个数字,分别表示已分配的文件描述符数量、已分配但尚未使用的文件描述符数量和系统可用的最大文件描述符数量。已分配的文件描述符数量就是当前正在被使用的文件描述符数量。0:文件描述符编号;/dev/pts/2:文件描述符对应的文件;该可以查看文件描述符资源是否释放干净。

2024-01-10 18:01:27 1016

原创 VScode右键没有go to definition选项

3.3. 如果C_CPP:intelli Sense Engine的配置是disabled;则下拉选择default;3.2. 在搜索框中搜索intelli Sense Engine (需要先安装C/C++)1.2. win重装系统,重新安装vscode出现问题,没重装系统之前是没问题的;1.1. 项目代码在远程服务器上;3.1. 打开设置界面:文件。

2024-01-08 17:40:21 9676 4

原创 Valgrind交叉编译

将bin,libexec两个目录移植到板子上,假设路径是:/mmc_data/tools/valgrind;这可能时你之前使用了--host=armv7-linux或者其他编译器没有清理make生成的文件,执行make而导致的;由于我是在海思3531上运行的,没有找到合适的libc6-dbg,所以就没向大家展示正确用法;但是编译过程是正确的,说实话这个工具对于arm系统不太友好,不知道是不是只是海思芯片有这问题。这行是没事的,只是工具的打印信息;7-15行是错误的:需要安装libc6-dbg;

2024-01-03 18:09:33 1158 1

原创 freetype位图制作的理论与用法详解,一篇文章学会freetype

该文档详细讲述了 各种格式的字符串(中文,英文)编码,怎么使用freetype制作成可以在lcd上显示的位图,并且如何将位图渲染到LCD上,每部分都有代码详细演示,不懂都难;可以使用freetype制作位图,用于视频字幕或logo,对从事音视频开发者很有参考价值。5.5 渲染GB2312,UTF8转化的Unicode。5.1 GB2312或UTF8生成位图。5.3 LCD坐标和笛卡尔坐标。3.1 基线,笔,布局。5.2 位图渲染到画布。5.4 两种渲染方式。4. freetype用法。

2023-12-19 11:21:32 656

原创 如何生成core文件进行项目调试?

由于项目前期的调试错误比较多,或者有某些隐藏危险:例如内存泄漏;偶尔才出现一次,如果没有捕捉错误的手段可能好不容易出现的机会就溜走了,所以生成core文件是必要的,发生段错误会生成相应的core文件,使用gdb可以查询错误原因和堆栈情况。

2023-12-14 14:00:45 554

原创 freetype将字符串制作成位图并显示过程详解

在流媒体项目中字幕显示是不可或缺的一环,一般会有字幕流在视频播放过程中进行显示;不过还有很多情况是从头到尾只在视频的某个区域显示某些文字,例如某个电视台的log;这种也称为字幕,如果想要将这些字符串显示到视频,需要将这些字符串做成位图进行显示,无法直接显示,freetype开源库就是将字符转化为位图的工具。画布和freetype是无法处理中文编码的,像GB2312或UTF8等中文编码需要转换成unicode编码才能够被处理,显示;

2023-11-18 20:30:26 1216 2

原创 嵌入式linux常用的文件传输方式

只需要下载个tftp服务器:tftpd64/tftpd32,安装到windows,然后运行,设置好ip地址和文件存放路径即可在开发板上使用tftp命令连接该服务器;ssh使用一般是最多的,将ssh服务器程序一直到开发板上,然后可以使用xshell进行访问,以windows的方式传输,也可以在虚拟机使用scp传输。如果虚拟机运行了nfs服务器,在arm上运行mount命令将虚拟机的某个目录挂载到arm上,然后使用cp,mv等即可传输文件。执行rz,会有win弹窗,选择想要传输的文件即可。

2023-11-02 16:11:46 717

原创 grpc的proto消息体中嵌套流类型数据

repeated类型用于表示重复的数据集合。它类似于编程语言中的数组或列表,可以包含多个相同类型的元素。但是如果想要获取的消息体只有一部分是流数据该怎么办呢?

2023-09-10 20:18:46 390

原创 TS流中的PCR与timeus(微秒)的相互转化

由PCR的结构信息可知其中只有program_clock_reference_base(时钟基准)和program_clock_reference_extension(时钟参考扩展)两个字段表示PCR数据,reserved为保留位;

2023-08-27 16:08:52 292

原创 TS流中的PTS,DTS与timeus(微秒)的相互转化

在TS协议流中PTS和DTS都是由五个字节表示,想要将五字节的时间戳数据转化为微秒就需要了解这五个字节时间信息的构成:根据IOS13818-1协议可知:由此可见,在五字节中真正表示时间戳的也只有33字节。其中标记位为1bit,值为1.因此要想获得pts和dts的微妙值只需要将代表时间戳的33bit拼起来就可以啦!由于PTS和DTS真正的时间戳数据只占33bit(ts协议规定,具体看我博客);

2023-08-24 15:10:52 645

原创 TS协议概念及传输流程

PAT的PID字段固定为0x0,也是TS解析的起点,解析ts流需要先找到PID为0x0的PAT包,PAT包中又包含了很多PMT的PID,PMT中包含了该节目的视频流PID和音频流PID,通过节目编号获取PMT编号,再通过PMT获取节目对应的媒体流PID,从TS流中找到对应PID的媒体流即可。进入河南卫视就会获取河南卫视的媒体流数据,该媒体流数据包括音频,视频,字幕等,就是获取TS中的获取河南卫视媒体流的PES包,进而播放媒体流。PID:包含在TS头中,标识特定的媒体流或TS包(PMT)。

2023-08-08 16:15:44 907

原创 TS协议之PES(ES数据包)

TS=TS头+PES头+ES。TS,PES头是在音视频流传输过程中需要的数据信息,而ES其实就是我们所说的要打包的音视频原始流数据:视频流(H264/H265), 音频流:(AAC)。最后一个ts:TS头+填充字节+部分ES;第一个ts:TS头+PES头+部分ES;协议:ISO/IEC 13818-1。第二个ts:TS头+部分ES;也就是一帧数据只有一个PES。0xc0:含有PTS和DTS。0x80:只含有PTS。

2023-08-06 16:49:13 1875

原创 TS协议之PMT(节目映射表)

是一个容器,里面包含了该节目需要的所有媒体流:音频流,视频流,字幕流等。因此一般情况下,一个PMT里面由两个TS_PMT_Stream代表两种流(视频流,音频流),通过TS_PMT_Stream里的元素PID来获取TS协议中的流媒体数据。一般情况下,N和N1是相等的,都等于媒体流的数量,假如该PMT中含有音频流,视频流,字幕流三种流的PID,则N和N1就等于3;而N中的descriptor()就包含了音频流,视频流,字幕流三种流的描述。PMT:节目映射表,与PAT成对出现,包含了该节目下所有的节目元素。

2023-08-04 17:50:05 639

原创 TS协议之PAT(节目关联表)

字段是一个容器:std::vector program;容器容每个TS_PAT_Program结构对用一个PMT,所以当PMT很多的时候可能超过188个字节,要进行分段;在TS传输过程中,就是遍历该容器通过查找program_map_PID字段找到对应的PMT。PAT:节目关联表,与PMT成对出现,包含所有的频道编号;是解析ts数据的起点。TS头:参考TS协议之PES(数据包),已做过解释这里不多做解释。后续会更新更多音视频相关技术,关注一下。

2023-08-03 16:14:35 580

原创 grpc时间管理系统

grpc有自己的一套时间管理接口time.h,实现了时间的获取及转化;这是三个极端时间点。gpr_time_0一般作为计时的起点或者比较时间的基准,可以用于一些初始化或比较操作中;gpr_inf_past/gpr_inf_future: 可以用来设置异步API的deadline参数,代表永不超时;

2023-07-30 10:57:27 748

原创 git创建仓库c及gitbash代码管理

该文章详细说明了从github的仓库创建到使用gitbash上传,更新代码的流程;github是作为成程序员必须知道且普遍会用到的代码管理的生气网站,存在代码存储,更迭等的强大功能;2.4.2 git指令。1. 上传代码后github仓库没有上传过的代码。2.3 导入github仓库。2.1 gitbash下载。2.2 配置ssh公钥。以上问题都给出了明确的解答;1. 创建git仓库。

2023-07-28 10:00:39 252

原创 cmake之file:文件处理命令

4.3 TO_CMAKE_PATH 和TO_NATIVE_PATH。3.3 REMOVE 和REMOVE_RECURSE。2.2 TOUCH和TOUCH_NOCREATE。3.1 GLOB和GLOB_RECURSE。5.1 DOWNLOAD和UPLOAD。2.1 WRITE和APPEND。3.6 COPY和INSTALL。

2023-07-23 15:46:59 393

原创 grpc之AsyncNext:获取完全队列中的请求/响应

程序运行后还没有任何请求,则got_tag为nullptr,这个很正常表示队列中没有数据,假如来了一个请求/响应,got_tag为请求/响应的对象的指针;= nullptr)容错中。如果完全队列没有响应,则AsyncNext方法阻塞到2023-07-13:00:00:01时刻进行返回,所以AsyncNext方法的超时是以某时刻为准,下次循环当前时间已经超过deadline的时间值从而没有超时效果;获取队列中可用的请求/响应,如果没有可用的数据则阻塞一定时间然后返回,这个阻塞的时间就是设置的超时时间。

2023-07-16 10:43:04 725 1

TCP服务器监测客户端异常退出方法

作为服务器必须得具备监测客户端状态得机制,以保证客户端处于不同的状态,服务器进行不同得状态处理,依次来提高实时性,可控性,并且有利于服务器得内存管理。其中客户端得异常处理就属于其中得一种。 客户端得断开情形无非就两种情况: 1.客户端能够发送状态给服务器;正常断开,强制关闭客户端等,客户端能够做出反应。 2.客户端不能发送状态给服务器;突然断网,断电,客户端卡死等,客户端根本没机会做出反应,服务器更不了解客户端状态。 客户端异常断开的监测手段及使用状态: 方法1: getsockopt函数获取套接字状态,根据状态判断客户端的连接情况。

2024-07-19

live555的核心数据结构值之闭环双向链表

live555是采用单进程,单线程的服务器,能够同时支持多个客户端连接,并且有条不紊的进行媒体流的调度,很大一部分原因在于对数据结构的巧妙应用。 下面介绍live555核心的数据结构:闭环双向链表 什么是闭环双向链表? 描述: 一个节点保存有前一个节点的地址和后一个节点的地址,并且最后一个节点的下一个节点地址指向第一个节点,第一个节点的前一个节点的地址指向最后一个节点; class HandlerDescriptor { HandlerDescriptor(HandlerDescriptor* nextHandler); virtual ~HandlerDescriptor(); public: int socketNum;//套接字文件描述符 int conditionSet;//要响应的状态(可读,可写,异常),回调函数执行的条件 TaskScheduler::BackgroundHandlerProc* handlerProc;//执行函数 void* clientData;//执行函数的参数 private: // Descriptors are

2024-07-19

live555 rtsp服务器实战之createNewStreamSource

live555用于实际项目开发时,createNewStreamSource和doGetNextFrame是必须要实现的两个虚函数,一般会创建两个类来实现这两个函数:假如这两个类为H264LiveVideoServerMediaSubssion和H264FramedLiveSource;H264LiveVideoServerMediaSubssion为实时视频会话类,用于实现createNewStreamSource虚函数; H264FramedLiveSource为实时视频帧资源类,用户实现doGetNextFrame函数; 那么这两个函数是什么时候被调用以及他们的作用是什么呢?本节将详细介绍; 声明:该文章基于H264视频源为基础分析,其他源类似; 由于这两个类主要是自定义虚函数,所以存在一定的继承关系,首先需要明确这两个类的继承关系(本章只介绍H264FramedLiveSource): H264FramedLiveSource:FramedSource:MediaSource:Medium

2024-07-19

live555 rtsp协议交互流程

rtsp在交互的过程中用到很多协议:tcp,udp,rtp,rtcp,sdp等协议;该篇文章主要分析在live555中这些协议是什么时候被创建的,什么时候被使用的等协议相关流程。 TCP:服务器与客户端进行协商(OPTION DESCRIBE SETUP PLAY); UDP/TCP:协议是rtsp服务器用来想客户端推流;当然rtsp向客户端推流也可以使用tcp协议;那么就rtsp而言使用udp推流和使用tcp推流有什么区别呢? UDP推流 tcp连接进行rtsp信令交互; 创建新的udp套接字来发送rtp包; 创建新的udp套接字来发送rtcp包; TCP推流 tcp连接进行rtsp信令交互; 复用rtsp的tcp连接发送rtp和rtcp包; 嵌入式开发一般使用udp推流,实时性相对较高; RTP:对视频流(h264/h265)/音频流(AAC/MP3)裸流进行封装,用于网络传输; RTCP:服务器和客户端用来管理流媒体协议;

2024-07-19

ffmpeg实现解复用MP4并解码音视频流

该代码主要实现解复用MP4的媒体流,并且将视频流 音频流进行解码;保存到文件中; 目录: 1. 打开输入流 2.获取视频解码器 3.获取音频解码器 4.解复用 5.存文件; 存文件需要根据yuv的类型进行不同的存储方式: yuv420存储方式: Y 分量 for (i = 0; i < video_decoded_frame->height; i++) fwrite(video_decoded_frame->data[0] + i * video_decoded_frame->linesize[0], 1, video_decoded_frame->width, video_fp); // 逐行写入 U 分量 for (int i = 0; i < height / 2; i++) { fwrite(video_decoded_frame->data[1] + i * video_decoded_frame->linesize[1], 1, video_decoded_frame->width / 2, video_fp); } // 逐行写入 V 分量

2024-03-24

ffmpeg 滤镜实现不同采样率多音频混音

该资源主要实现多个AAC文件的混音功能;ffmpeg版本:5.14 利用ffmpeg开源库 对AAC数据进行解码,然后使用FFMPEG滤镜类对多个解码的PCM数据进行混合,最后对混合后的数据进行AAC编码; 主要内容: 音频解码,滤镜混音,音频编码 内容亮点: 当一个文件读取完毕后,程序不会停止,会继续读取其他文件,直到所有数据读取完毕 可以实现不同采样率的音频混合; 该代码以经过验证无误,下载下来后知名ffmpeg库可直接编译; 编译之前请确认ffmpeg版本是否匹配,不同的版本有着很大的差别;

2024-03-17

freetype位图制作的理论与用法详解,一篇文章学会freetype

该文档详细讲述了 各种格式的字符串(中文,英文)编码,怎么使用freetype制作成可以在lcd上显示的位图,并且如何将位图渲染到LCD上,每部分都有代码详细演示,不懂都难;文档目录如下: 概要 2 1. 头文件的使用 2. 分配空间 3. 字形度量 3.1 基线,笔,布局 3.2 布局 3.3 字形 3.4 中英文字形布局区别 4. freetype用法 5. 项目实操 5.1 GB2312或UTF8生成位图 5.2 位图渲染到画布 5.3 LCD坐标和笛卡尔坐标 5.4 两种渲染方式 5.5 渲染GB2312,UTF8转化的Unicode

2023-12-19

freetype开源库API 核心结构中文解释及代码演示

该文档详细描述了 freetype常用的API,核心结构体的用法,难点,疑惑点等,每个函数都有对应的示例代码方便理解; 文档内容分为三个模块: 1.概要 2.核心结构体 3.API详解 通过示例代码了解函数用法

2023-12-12

流媒体音视频技术:grpc协议实现流媒体传输,proto消息体中的流类型嵌套

stream流类型在grpc的实际项目中是出现频率很高的数据类型,一般是位于交互参数或者返回值的位置: rpc Get_Stream(request) returns(stream response){}//获取数据流 rpc Put_Stream(stream request) returns(response){}//发送数据流 但是如果想要获取的消息体只有一部分是流数据该怎么办呢? //例如获取某个班级的学生信息: //学生信息 message Stu{ string name = 1; sint32 age = 2; } //班级信息 message Msg{ //班级名称(几年级几班) string classNum = 1; //一个班级有好多学生,要用流的方式 //有可能你以为是:stream Stu student = 2;stream不用于消息体,一般使用repeated repeated Stu student = 2;} repeated类型用于表示重复的数据集合。它类似于编程语言中的数组或列表,可以包含多

2023-09-10

TS协议之PMT(节目映射表)

PMT:节目映射表,与PAT成对出现,包含了该节目下所有的节目元素。 PMT数据结构如下: 字段分析; 节目元素单: 基本流媒体类型:官网地址;H2.64流媒体类型为0x1B,H2.65流媒体类型为0x24,AAC流媒体类型为0x0F 实例代码如下: 由代码可以看出节目元素表为:std::vector<TS_PMT_Stream> PMT_Stream;是一个容器,里面包含了该节目需要的所有媒体流:音频流,视频流,字幕流等。因此一般情况下,一个PMT里面由两个TS_PMT_Stream代表两种流(视频流,音频流),通过TS_PMT_Stream里的元素PID来获取TS协议中的流媒体数据。 封装代码如下: PMT封装代码如下: PMT的描述信息分析:参考官网资料: program_info_length:节目描述信息长度,描述信息就跟在该字段后面; ES_info_length:ES描述信息长度,描述信息就跟在该字段后面; 下面看一下官网定义的描述信息结构:

2023-08-04

SIP协议开源库Vocal-1.5.0

Vocal是目前SIP开源库使用最广泛的一种开源库; 由Vovida出品的包括RTP、RTCP、SIP等各种基础协议栈和SIP UAC、UAS等功能的IP电话服务器端程序。编译环境为linux-Vovida produced in RTP, RTCP, and other SIP based protocol stack and SIP UAC and UAS capabilities of IP telephony server procedures. Linux compiler environment。 已于2008年停止开发,并且被Kotiteffects收购,但是目前人有社区人员进行维护和更新

2023-08-04

TS协议之PAT(节目关联表)

PAT:节目关联表,与PMT成对出现,包含所有的频道编号;是解析ts数据的起点。 typedef struct TS_PAT_Program { unsigned program_number :16; //节目号 unsigned reserved_3 : 3; // 保留位 unsigned program_map_PID :13; //节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个 }TS_PAT_Program; 上述代码可见节目单字段是一个容器:std::vector<TS_PAT_Program> program;容器容每个TS_PAT_Program结构对用一个PMT,所以当PMT很多的时候可能超过188个字节,要进行分段; 在TS传输过程中,就是遍历该容器通过查找program_map_PID字段找到对应的PMT。

2023-08-03

TS协议之PES(数据包)

1. 概要 1.1 TS数据包(PES)协议数据组成 TS=TS头+PES头+ES。TS,PES头是在音视频流传输过程中需要的数据信息,而ES其实就是我们所说的要打包的音视频原始流数据:视频流(H264/H265), 音频流:(AAC)。 协议:ISO/IEC 13818-1 1.2 TS数据包(PES)协议格式 1.3 字段解释 1.3.1 TS 1.3.1.1 TS头 字段字段描述同步字节固定为0x47错误标识通常为0负载起始标识符因为一个TS包规定为188字节,一帧数据可能被分为好多切片,帧数据第一个切片该标识为1,其余切片为0;传输优先级0:低优先级,1:高优先级,通常取0;PID值用于数据标识传输加扰控制00:未加密,通常取0是否包含自适应区00:保留01:为无自适应域,仅含有效负载10:为仅含自适应域,无有效负载11:为同时带有自适应域和有效负载。递增计数器大小4bit,范围:0-15,不一定从0开始,但是必须是连续递增的,如果加到15,从0重新开始++。 1.3.1.2 自适应区 字段字段描述自适应区长度自适应区的数据长度是否包含PCR0x50:包含PCR,0x40

2023-08-03

github创建仓库及gitbash代码管理

  该文章详细说明了从github的仓库创建到使用gitbash上传,更新代码的流程;及搭建环境过程中常遇到的问题的解决方案,第一次搭建常遇到的问题: 使用git clone xxx 指令下载仓库到本地是可能遇到如下问题: fatal: unable to access 'https://gxxx.git/': Failed to connect to github.com port 443 after 21051 ms: Couldn't connect to server 在上传代码或者更新代码时可能会遇到如下问题: 1. 上传代码后github仓库没有上传过的代码 2. 更新代码时遇到如下问题: [master (root-commit) 8cb016f] first 1 file changed, 1 insertion(+) create mode 160000 rtspServer 3. 上传linux代码过程中可能遇到如下问题:  warning: in the working copy of ‘...‘, LF will be replaced by CRLF

2023-07-28

cmake之file命令:文件处理命令

该文档详细介绍了cmake的file命令的各种模式即详细用法: 1. 读(Reading)         1.1 READ         1.2 STRINGS         1.3 HASH         1.4 TIMESTAMP         1.5 GET_RUNTIME_DEPENDENCIES 2. 写(Writing)         2.1 WRITE和APPEND         2.2 TOUCH和TOUCH_NOCREATE         2.3 GENERATE         2.4 CONFIGURE 3. 文件系统(Filesystem)         3.1 GLOB和GLOB_RECURSE         3.2 MAKE_DIRECTORY         3.3 REMOVE 和REMOVE_RECURSE         3.4 RENAME         3.5 COPY_FILE         3.6 COPY和INSTALL         3.7 SIZE        ...等

2023-07-23

c++ jsoncpp所有类及类方法的全面解析(代码示例)

该文档详细讲述了jsoncpp的各种类: json::Value,Json::FastWriter, Json::StyledWriter, Json::Reader, Json::Writer, Json::ValueIteratorBase,Json::StyledStreamWriter,Json::ValueIterator等类的解析 以及各种类中的全部方法的解析,序列化,反序列化,增删改查,读取流,存储流,读文件,写文件等 每个方法都有一个小的代码实例进行讲解,使理解更方便

2023-06-13

一篇文章学会grpc编程,全网最详细,最全面保姆级教学

该文章非常适合学习或者开发grpc的技术人员阅读,通篇通俗易懂,解析全面,代码演示,刨析,一篇文章即可学会grpc编程 该文章总共分为八个章节: 1. proto文件详解 2. pb.cc, grpc.pb.cc文件的内容详解 3. 编写grpc服务器 4. 编写grpc客户端 5. Status返回状态详解 6. stream(流式传输)编写流程 7.超时机制 8. 编写CMakeLists.txt 9.common.cmake分析 cmake的编写,服务器,客户端的编写,返回状态的设置,pb文件的解析,存根的调用等全面解析。值得一看 该文档一直在实时更新,持续关注

2023-05-28

find-package深入刨析及使用实例

该资源深入刨析了find_package函数的用法,以及使用方法的demo展示,内容如下: 1. 检索模式 1.1 module模式 1.2 config模式 1.2.1 搜索路径详解 1.2.2 搜索版本详解 2. 命令格式 2.1 基础命令 2.2 高级命令 3. 使用方法demo 搜索文件find<packname>.cmake编写: //CMAKE_SOURCE_DIR:CMakeLists.txt所在的目录 //在指定目录(${CMAKE_SOURCE_DIR}/include)下查找add.h文件,如果找到将路径返回给ADD_INCLUDE_DIR find_path(ADD_INCLUDE_DIR add.h ${CMAKE_SOURCE_DIR}/include) //在指定目录(${CMAKE_SOURCE_DIR}/lib)下查找add.h文件,如果找到将路径返回给ADD_LIBRARY, //NAMES : 要查找的库名字,可以有多个 //PATHS:查找的路径,可

2023-05-28

libstdc++.so.6.0.25

libstdc++ 6.0.25版本的库文件,可解决/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.22' not found版本过低问题。 下载下来后,进入/usr/lib/x86_64-linux-gnu/,删除旧的libstdc++.so.6软连接,然后创建新的软连接指向6.0.25版本的库:ln -s /XXX/libstdc++.so.6.0.25 /usr/lib/x86_64-linux-gnu/libstdc++.so.6

2023-05-23

FLV解复用代码实现!!!!

使用ffmpeg协议解复用FLV文件,获得h264视频数据和aac音频数据。 源码已经编译通过 并能够运行 能够进行循环读取文件, 通过数据类型获取音频,视频, 源码采用文件IO模式读取数据,另外还有内存IO模式获取数据,具体内存IO怎么获取数据可以参考我以后的博文 else if (video_index == pkt->stream_index) { // 视频流 std::cout << "写入视频size:" << pkt->size << std::endl; //添加start code,注意:MP4包不带start code ts包是带的。带的话也能调用该接口,不会重复添加 std::cout << "视频时间戳:" << pkt->pts << std::endl; std::cout << "视频时间基:分子:" << pkt->time_base.num << "分母" << pkt->time_base.den << std::endl; init_h264_mp4toannexb(vid

2022-11-15

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

TA关注的人

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