自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ffmpeg实现媒体流解码

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

2024-03-24 16:46:19 745

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

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

2024-03-22 09:23:48 405

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

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

2024-03-17 16:14:37 1101

原创 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 838

原创 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 498 2

原创 c语言实现内存池

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

2024-02-06 11:55:05 325

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

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

2024-02-04 15:20:45 353

原创 aiXcoder自动跳出

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

2024-01-23 10:51:29 425

原创 linux信号处理机制

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

2024-01-19 11:59:51 390

原创 vscode无法自动补全

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

2024-01-13 16:29:23 1321

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

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

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

原创 linux文件描述符管理

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

2024-01-10 18:01:27 401

原创 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 1324

原创 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 557

原创 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 395

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

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

2023-12-14 14:00:45 428

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

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

2023-11-18 20:30:26 302

原创 嵌入式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 249

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

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

2023-09-10 20:18:46 221

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

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

2023-08-27 16:08:52 168

原创 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 295

原创 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 479

原创 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 1368

原创 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 264

原创 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 278

原创 grpc时间管理系统

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

2023-07-30 10:57:27 573

原创 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 199

原创 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 254

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

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

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

原创 Cmake function详解

commands: 函数的内部实现,其实就是多个shell命令的集合,函数没有被调用时不执行。想要了解更多cmake命令和用法请持续关注我的博客,一起学习交流。创建一个函数,函数内部为多个指令的集合,方便以后的调用。arg1: 函数需要的参数。name: 定义的函数名。

2023-07-16 09:38:43 224

原创 cmake之add_compile_definitions:添加预定义宏

add_compile_definitions 是 CMake 中的一个命令,用于向编译器添加预定义宏。它会在编译过程中将指定的宏定义添加到源代码中。可以指定多个宏定义,它们将按顺序添加到编译器中。

2023-07-16 09:19:30 655

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

以及各种类中的全部方法的解析,序列化,反序列化,增删改查,读取流,存储流,读文件,写文件等。每个方法都有一个小的代码实例进行讲解,使理解更方便。Json::ValueIterator等类的解析。

2023-06-13 19:24:01 991

原创 c++ 库jsoncpp的常用方法解析

在处理json数据时,经常会需要确定json object的值类型,从而进行对应的处理,下面说一下json值怎么创建与判断!在处理json数据时,数据的序列化及反序列化是经常要使用的方法,下面详细介绍些jsoncpp关于序列化及反序列话的方法。

2023-06-10 20:16:40 2907

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

该文章非常适合学习或者开发grpc的技术人员阅读,通篇通俗易懂,解析全面,代码演示,刨析,一篇文章即可学会grpc编程。cmake的编写,服务器,客户端的编写,返回状态的设置,pb文件的解析,存根的调用等全面解析。2. pb.cc, grpc.pb.cc文件的内容详解。6. stream(流式传输)编写流程。7. 编写CMakeLists.txt。8. common.cmake分析。5. Status返回状态详解。1. proto文件详解。3. 编写grpc服务器。4. 编写grpc客户端。

2023-05-28 15:19:04 480

原创 UDP网络编程实战用法

既然这样为什么都说udp类似于广播呢?这是因为udp与通讯双方没有做连接动作,udp只是指定地址把数据散发出去,这个时候其他udp都可以接收这个数据,但是由于有指定地址,所以只有指定的地址才能接收该信息。类似于spi总线,主设备发送信号以后,所有从设备都能收到信号,从设备会判断是不是给自己的,如果不是就忽略。上述代码应该已经很明白了,所以理论上来说udp没有所谓的服务器,客户端之说;上述代码的通讯方式类似于点对点通讯,发送的数据只能被指定的ip地址收到。该文章对萌新非常友善,值得一看。

2023-05-28 14:29:00 129

原创 find_package深度解析及实例应用

默认情况下,包括两个端点。如果传递了NO_PACKAGE_ROOT_PATH,或者将CMAKE_FIND_USE_PACKAGE_ROOT_PATH设置为FALSE,则可以跳过此操作。/*/(lib/|lib*|share)/cmake/*/就表示可能在/lib/cmake/或者/lib*/cmake/或者/share/cmake/目录下.可以通过NO_CMAKE_PATH选项或将CMAKE_FIND_USE_CMAKE_PATH设置为FALSE来跳过。

2023-05-28 14:17:21 1910

原创 c++实现gRPC

无论什么语言,实现grpc的核心是.proto文件,通过protoc命令将.proto文件生成grpc框架的接口文件*gb*, 该文件中包含.proto定义的方法及参数接口,服务器,客户端相关操作接口;然后再编写服务器,客户端代码,调用*gb*文件生成的接口。后期会发布一篇grpc程序编写的完整流程,从proto,*.pb.cc, *.grpc.pb.cc解析 到服务器 客户端代码编写,cmake编写,返回状态设置,.cmake文件解析的全面刨析,让您一篇文章学会grpc。

2023-05-22 20:41:05 1788

原创 负数的二进制表示

在计算机中都是以补码数据存储数据的,正数的反码,补码都是其本身,负数的反码,补码如上所属;到这就已经能初步解释上面的问题了,刚接触c语言的萌新可能对负数的二进制表示很蒙圈,-1不应该是10000001吗?由上面的例子可知:-1在计算机就是以11111111存储的,所以显示出来就是11111111;-1补码:11111111(这就是计算机上显示出来的-1的值)正数的反码是原码,负数的反码是除了符号位之外,其余位取反。正数的补码是原码,负数的补码是反码加一。带符号位的,其余位表示数值。

2023-04-18 17:50:45 696

原创 linux C ioctl设置,获取网关,路由信息

这个结构由SIOCADDRT和SIOCDELRT调用传递,白话就是这个结构就是在添加路由和删除路由的时候被调用。SIOCADDRT:添加路由,SIOCDELRT:删除路由,就是ioctl调用时使用的请求码。该代码获取了路由表的所有ip 子网掩码,网关(下一跳),并且将获取到的信息保存在RouteTable容器中,想要获取路由信息可以参考该代码。温馨提示:路由设置时ip不最后一个字节要为0才能设置成功,及ip:XXX.XXX.XXX.0。

2023-04-02 20:48:59 2351

原创 linux c ioctl接口实现本地IP,子网掩码的获取与设置

在日常开发中避免不了对本地网络的设置需求,一般情况下我们使用system接口进行临时的IP修改,或者open,rend write,操作/etc/network/interface这样的网络文件实现IP的永久修改,但是这样的修改方式相较来说比较低端。

2023-04-01 17:10:11 1455 1

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关注的人

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