- 博客(19)
- 收藏
- 关注
原创 qt+gstreamer快速创建一个流媒体播放器
除了基础组件外,gstreamer还提供了一些上层的已经封装好的容器组件(bin),比如这次我们要用到的playbin3就是一个高级的多媒体播放组件,里面对网络协议、parseer、解码器(包括硬解码)、音视频播放等进行了封装,另外playbin3对视频硬解码以及硬件渲染的支持也很好,作为使用者只需进行创建、设置一些属性、运行即可,使用起来很简单。并且playbin3除了可以播放本地文件外,对于常见的流媒体协议都进行了支持,包括rtmp、http-flv、rtsp等。
2025-02-06 15:13:17
444
原创 electron打包客户端在rk3588上支持h265硬解
前言我们的客户端程序是用electron打包的前端程序,其在rk3588主机上的linux环境运行。之前使用客户端查看h264编码的视频直播是没有问题的,但视频源更改为h265编码后就不能查看了,奇怪的是打包的windows客户端则可以正常查看,另外rk3588主机上的chromium浏览器也是支持播放h265编码的视频的,并且是硬件解码。
2025-01-24 16:23:34
1085
原创 electron在arm64架构交叉编译遇到libnotify/notify.h文件找不到错误记录
由于当前目标架构是arm64,所以从上图可知sysroot为build/linux/debian_bullseye_arm64-sysroot,进入到该目录下查看libnotify的头文件和库文件,的确找不到,而其他架构如i386下是存在对应文件的,如下图所示,所以我们只要补齐头文件和库文件即可。在按照官方文档进行arm64下electron编译时出现下面的错误,编译环境为ubuntun22.04.5。将i386架构下的libnotify拷贝到arm64下的usr/include目录下。
2024-12-30 17:17:19
410
原创 使用node-addon-api实现从c到nodejs模块全流程
作为一个前端小白,下面详细的记录下如何将一个c语言写的库使用node-addon-api封装为nodejs的模块,过程中遇到一些坑并最终解决,希望其他朋友可以参考下。这里遇到了一个坑,可就是libraries的配置,不能写成-L./native,因为会在build目录下执行相应的命令,这个花费了很长时间才解决。创建 native/addon.cc,用于封装 C 动态库。
2024-11-21 15:43:39
1014
原创 使用线程局部存储解决ffmpeg中多实例调用下自定义日志回调问题
这里我们发现av_dump_format是在process函数中调用的,他们一定属于同一个线程,所以可以通过定义一个全局的线程局部变量,并在process函数开始设置为当前调用的上下文,之后就可以在av_dump_format的日志回调中使用这个线程局部变量来获取当前调用的上下文,这样就实现了区分多实例的目的。为了获得av_dump_format的日志输出,我们首先使用av_log_set_callback来对ffmpeg里面的日志进行接管,但是av_dump_format里面打印日志时无法传递任何标识。
2024-11-20 16:45:10
445
原创 修改ffmpeg实现https-flv内容加密
参考了阿里云直播加密方案后我们的内容加密架构图如上,其中播放器基于ffmpeg开发,使用的是https-flv协议,其中对称加密使用的是aes加密ctr模式,在之前进行录像加密时需要实现从任意字节任意长度进行加解密,因此之前已经封装了一套基于openssl的加解密函数(链接为),但直播内容加密是从前向后的有序流式传输,不存在seek操作,因此这个场景较为简单。https-flv的数据解密既可以放到协议层,也可以放到解封装层,经过比较还是放到协议层修改比较方便,对应的文件就是http.c。
2024-11-20 15:39:13
631
1
原创 使用opencv将文字隐藏在图片中
灰度图像是单通道,彩色图像是3通道或者4通道,每个通道通常是1个字节。因为每一个像素点只能使用最低的那一位,所以我们的有效数据必须是0或者1,因此我们需要先对待隐藏图片进行处理,这里我们发现我们的有效文本信息是黑色,背景是白色,所以可以先通过阈值处理对图像进行二值化,这样有效数据就是0,无效数据就是1,处理后的图像显示如下。通过图像的按位或运算来写入隐藏信息,这里我们仍然保持G通道和R通道不变,写入后就可以将图片保存起来,需要注意的是只能使用无损压缩比如png格式进行保存,否则最低位会被破坏掉。
2024-10-28 17:40:31
570
原创 ekho移植,使用docker方案
,但是这个方案其实是挺麻烦的并且也踩了很多坑,因为所有依赖的库都需要进行交叉编译,依赖的库还有属于自己的依赖库,另外还需要进行交叉编译链的配置,这导致之前用交叉编译方案时仅仅编译了ekho8.0版本,而不是最新的9.0版本,并且因为pulseaudio交叉编译时遇到了没有解决的问题,导致使用ekho时不能直接播放需要借助aplay。因为我的目标主机是arm64架构,我的编译环境是x86-64架构,由于二者的架构不兼容,直接运行镜像会报错,需要使用QEMU(Quick Emulator) 来进行架构仿真。
2024-10-14 15:12:54
421
原创 ekho交叉编译全过程
3)这样espeak就被安装到arm_install目录下,在我机器的绝对路径是/home/linux/ekho_new/espeak-1.48.04-source/src/arm_install,后面会用到。1)从https://sourceforge.net/projects/e-guidedog/files/Ekho/8.0/下载ekho-8.0.tar.xz。1)从https://files.portaudio.com/download.html下载portaudio_v18_1.zip。
2024-10-12 09:57:50
612
原创 修改ffmpeg源码为rtsps协议增加证书校验功能
鉴于安全原因,我们将之前使用ffmpeg api实现的rtsp推流修改为rtsps,因为ffmpeg本身支持rtsps,所以我们只需编译配置ffmpeg时增加-enable-openssl参数,然后使用ffmpeg api时直接将rtsp替换为rtsps即可(以及对应的端口修改,同时服务端也需要支持rtsps)。
2024-09-24 13:45:28
951
原创 修改ffmpeg源码实现rtps协议(rtp over tls)
对于rtps_open,首先调用av_url_split获取协议的hostname(域名或者ip)、端口以及协议名,之后对协议名进行判断如果是rtps则表明我们要使用的底层协议是tls,因为ff_rtps_protocol的name字段是rtps,所以走到rtps_open时其协议名一定是rtps,也就是说这里的判断多此一举了,如果想同时支持TCP和TLS的话可以通过增加选项来实现。的代码,这里的更加简单,都不需要编解码,仅仅是转封装,不再描述。
2024-08-29 13:29:01
886
原创 记一次ffmpeg自动流选择遇到的问题
因为ffmpeg这个进程就是ffmpeg.c及相关源文件编译出来的,所以可以通过扒代码的方式来进行分析,最终通过代码调试,发现问题出在自动流选择的score计算上,具体就是AVStream的disposition上,A.mp4和B.mp4都包含两个视频流和两个音频流,但第一个音频流和第一个视频流被ffmpeg当作是默认流(也就是具有AV_DISPOSITION_DEFAULT标识),所以默认流的得分要比非默认流的得分大5000000,因此解释了上面“不合理“的地方。
2024-07-17 16:38:32
346
原创 使用fbdev进行屏幕图像采集
fbdev即frame buffer device,翻译为帧缓冲设备,代表了显示硬件的抽象,每个帧缓冲设备对应于一个显示屏或显示控制器。它通过/dev/fbx(如/dev/fb0)设备文件对外暴露,可以通过读写这些文件来进行图像的采集与图像的显示。
2024-07-10 14:43:30
581
原创 使用AES CTR模式实现任意位置数据加解密
最近对我们的项目进行安全优化,我们的服务程序在使用过程中会持续接受客户端的一些数据并追加写到文件中,文件写入完毕后还支持客户端的随机访问来获取这些结构化信息。CTR模式的关键是计数器,如果我们知道任意位置的计数器那么就可以进行解密,由于CTR模式的计数器是按照分组递增的,所以我们只要知道是哪一个分组即可,而AES进行加解密的分组大小不管是128位还是其他都是16字节,所以可以根据读取的数据所在的字节位置/16知道所在哪一个分组,然后再加上初始的计算器就得到了该分组的计数器了,之后解密就很简单了。
2024-07-03 17:48:45
2592
原创 ffmpeg API实现拉取rtsp流存储为图片
在avformat_open_input之后我们通常会调用avformat_find_stream_info来获取输入文件的流信息,这是因为提供的输入文件可能没有文件头或者文件头没有足够的信息,avformat_find_stream_info会尝试解码来获取更多的信息。和解码一样,新版本的ffmpeg使用avcodec_send_frame和avcodec_receive_packet来代替旧的编码接口avcodec_encode_video2来进行编码,其用法也和解码一样。
2024-06-26 15:14:58
3112
原创 http响应的数据部分长度
http是一个无状态的应用层请求/响应协议,其请求和响应消息都是由起始行、若干行头部(以空行表示结尾)和可选的数据部分,那么在进行http请求时,响应的数据部分长度该如何确定呢?
2024-06-24 13:09:39
565
原创 webrtc中媒体协商中的媒体数据方向
createOffer的参数表示了我们希望接受的媒体数据,代表了数据接收方向,在上面demo中实际上由offerOptions的offerToReceiveAudio和offerToReceiveVideo决定,当参数取值为true时表示我们希望接受对应类型的媒体数据。addTrack的参数表示了我们可以提供的媒体数据,代表了数据发送方向,在上面demo中track实际上由mediaOptions中的audio和video参数决定,当参数取值为true时表示我们可以提供对应类型的媒体数据用于发送。
2024-06-08 10:12:33
456
原创 ffmpeg可执行程序裁剪
最近我们在嵌入式板子上有一个需求,拉取网络摄像头的rtsp流保存为jpg/png图片,我们准备借助ffmpeg命令行工具去完成,命令行实现这个功能很简单,但是编译出的ffmpeg可执行程序的大小很大,因此我们尝试对ffmpeg可执行程序进行编译裁剪,最终我们发现按照下面方法后进行裁剪后的大小只有之前的1/4不到,解决了我们遇到的问题。
2024-05-29 15:28:17
1712
原创 ffmpeg进程优雅退出
有时我们会在程序中通过fork/execl方式调用ffmpeg进程执行某些命令,这通常比调用API更简单。然后我们等待这些命令执行完毕后ffmpeg进程自动就会结束,但如果我们的任务是需要长时间运行比如拉取rtsp流保存为mp4,我们希望这个工作可以随时终止,终止的时候ffmpeg要优雅的退出,即ffmpeg要可以在退出时执行写入mp4的元数据、正常关闭文件等清理工作,使他看起来就像是正常退出一样,ffmpeg可以吗?
2024-05-23 17:02:15
1454
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人