背景提要
安全堡垒机中需要保存大量录屏视频,包括操作员的视频操作指导、报错前的故障内容等,由于视频数量多、体积大,而项目需要长时间保存这些视频,这耗尽了存储资源,影响了系统功能的执行。因此考虑对推流视频进行压缩,在保证视频质量的前提下,压缩视频所需的占用空间。此外,经过测试发现ffmpeg视频压缩需要花费大量时间,所以还需实现对视频压缩过程进行加速。
当前的推流转码方案,通过ffmpeg
插入到obs_record表之前把流名称的后缀名换一下
推流结束更新time_end时间后进行格式转换,如果命令执行成功就删除同名的flv文件 去掉while循环,因为一直没成功那就卡死在这了,只要时间把握对了,是在推流结束之后转就没问题,那个flv存在且不损坏,那基本上能转成功
考虑新方案,gstreamer可同时完成视频压缩和格式转换,需要测试硬件加速效率
存在问题:目前的压缩方案很多涉及到使用GPU等硬件,而厂站没有GPU硬件,也没有核显可以做硬件加速
解决过程:产品使用云涌的设备,他们的设备支持硬件加速,但是只支持gstreamer
参考gstreamer的官方手册:
首先参考这篇博文,了解GStreamer是什么
Gstreamer知识点
gstreamer的高性能主要体现在:
使用GLib的g_ mem_ chunk和非模块化分配算法使得内存分配尽可能最小。
插件之间的连接非常轻型(light-weight).
数据在管道中的传递使用最小的消耗,管道中插件之间的数据传递只会涉及指针废弃。
提供了一套对目标内存直接进行操作的机制。例如,插件可以向X server共享的内存空间直接写数据,缓冲区也可以指向任意的内存,如声卡的内部硬件缓冲区。
refcounting和写拷贝将memcpy减少到最低。
子缓冲区有效地将缓冲区分离为易于管理的块。
使用线程联合(cothreads)减少线程消耗。线程联合(cothreads)是简单又高速的方法来切换子程序,作为衡量最低消耗600个cpu周期的标准。
使用特殊的插件从而支持硬件加速。
采用带有说明的插件注册,这样的话只在实际需要使用该插件才会去装载。
所有的判断数据都不用互斥锁。
Gstreamer的使用方式:
其实Gstreamer全是插件。每一次播放,编