- 博客(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
原创 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并解码音视频流
2024-03-24
ffmpeg 滤镜实现不同采样率多音频混音
2024-03-17
freetype位图制作的理论与用法详解,一篇文章学会freetype
2023-12-19
freetype开源库API 核心结构中文解释及代码演示
2023-12-12
流媒体音视频技术:grpc协议实现流媒体传输,proto消息体中的流类型嵌套
2023-09-10
TS协议之PMT(节目映射表)
2023-08-04
SIP协议开源库Vocal-1.5.0
2023-08-04
TS协议之PAT(节目关联表)
2023-08-03
TS协议之PES(数据包)
2023-08-03
github创建仓库及gitbash代码管理
2023-07-28
cmake之file命令:文件处理命令
2023-07-23
c++ jsoncpp所有类及类方法的全面解析(代码示例)
2023-06-13
一篇文章学会grpc编程,全网最详细,最全面保姆级教学
2023-05-28
find-package深入刨析及使用实例
2023-05-28
libstdc++.so.6.0.25
2023-05-23
FLV解复用代码实现!!!!
2022-11-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人