标题:Qt编写视频监控系统70-OSD标签和图形信息(支持写入到文件)
作者:liudianwu
日期:2023-02-13 09:06
内容:
## 一、前言
作为一个完整的视频监控系统,用户还需要自定义一些OSD标签信息显示在对应通道上面,而且不止一个OSD标签信息,位置可以在四个角或者指定坐标显示。最开始本系统设计的时候,由于本人擅长的是painter绘制,所以直接采用的painter绘制贴在视频控件上,顶层放了个cover窗体覆盖在上面,后面发现这种机制并不能将OSD标签信息存储到视频文件,而且弊端多,不是源头绘制的,相当于和视频源无关,当切换等比例缩放等图片效果时,仅仅是在cover窗体上能看到,所以设置的标签位置看起来怪怪的,当然这种机制也是有部分场景需要的,所以在重新设计标签和图形绘制功能的时候,这块功能也需要保留。
如何能够从源头实现OSD标签和图形信息,则必须用到滤镜这个东西,在ffmpeg中对应的是avfilter模块,也可以说是特效库,可以实现各种特效比如色调/模糊/水平翻转/裁剪/加方框/叠加文字等功能,这些特效是直接应用在源头视频数据帧avframe上的,意味着保存视频文件的代码根本不用修改,直接就可以把这些特效存储到文件,所以在一些智能算法厂家中,识别到的人员信息以及方框都会通过两种策略发送出来,一种是源头滤镜加工好,同时还会以文本信息加在视频流中,让用户自己解析绘制,这样就涵盖到了所有的情形。
ffmpeg滤镜的基本步骤:
- avfilter_get_by_name 获取要使用的滤镜
- avfilter_inout_alloc 创建输入输出滤镜参数
- avfilter_graph_alloc 创建滤镜容器
- avfilter_graph_create_filter 创建输入输出滤镜
- av_opt_set_int_list 设置输出滤镜格式
- outputs->name/outputs->filter_ctx... 设置滤镜的参数
- avfilter_graph_parse_ptr 初始化滤镜
- avfilter_graph_config 应用滤镜配置
- avfilter_free 释放滤镜对象
- avfilter_graph_free 释放滤镜容器
貌似滤镜一旦设置好以后就不允许通过参数修改,比如设置了一个文字水印 drawtext=text='hello':fontsize=30:fontcolor=#ffffff:x=10:y=10 ,想要修改这个内容,滤镜相关类没有提供对应的函数,需要先把之前的滤镜资源释放,然后重新创建,相当于这个过程来一遍,那是不是又会担心效率问题?而且矩形区域很多的时候,都是经常切换滤镜的,性能上多多少少会占用一些CPU,但是应用起来还是非常快的,几乎看不到切换的停顿或者空白效果。详细的滤镜参数参考官方说明 [https://ffmpeg.org/ffmpeg-filters.html](https://ffmpeg.org/ffmpeg-filters.html) 。 ..