【音视频处理】基础框架介绍,FFmpeg、GStreamer、OpenCV、OpenGL

大家好,欢迎来到停止重构的频道。 

本期我们介绍音视频处理的基础框架

包括FFmpeg、GStreamer、OpenCV、OpenGL 。

我们按这样的分类介绍 :

1、编解码处理:FFmpeg、GStreamer

2、图像分析:OpenCV

3、复杂图像生成:OpenGL

编解码处理:FFmpeg、GStreamer

首先是编解码处理的基础框架,这类基础框架的应用场景是最为广泛的

因为在绝大数情况下,如视频高清/标清转换、视频文件轮播、视频流多合一处理、导播信号源切换、视频播放等等,实际上都可以归类为编解码处理

对于编解码处理的基础框架,比较流行且可靠的是FFmpeg和GStreamer ,比较出名的直播工具OBS和很多播放器都是基于FFmpeg开发的。

 

对于这两个框架的选择,我们更推荐FFmpeg,虽然GStreamer是一种模块化的框架,理论上只要加入模块就可以扩展更多的场景,如AI处理等。但是这种方式也会加大代码理解的难度,各种异步通信、线程交互会让人头昏脑胀。

而FFmpeg的设计更专注于编解码处理,代码结构根据封装、编解码、filter处理等步骤而设计 代码理解上相对更加容易。

这里我们的关注点放在代码理解上,你可能会奇怪,基础框架不就是使用API调用就可以了吗 ,再不行就翻翻文档、或网上搜索一下不就好了吗?

但是,由于从事音视频处理的工程师实际并不多,而且由于视频编解码处理的过程本身就很复杂,所以难免会出现很多特殊问题,网上很难找到相似问题的答案。

很多时候你只能看框架源码,甚至一些时候还需要在框架源码上追加log以追查问题,所以我们更推荐源码更容易理解的FFmpeg ,FFmpeg的编译安装、API使用我们在后续内容会详细介绍。

FFmpeg的源码是c编写的 ,如果自身程序不是c/c++ 如Java、Python等也有调用方案。

这里需要特别说明的是FFmpeg是提供命令行方式调用的 ,官网有很详细的说明 ,如果是简单的处理 ,确实是可以通过程序生成命令行就可以实现功能。

 

但是以命令行的方式使用FFmpeg实际上并不好,很多复杂的功能就很难实现,而且一旦发生错误的话,通过捕捉报错log也很难定位问题。

所以要是想开发一个稳定可靠的音视频处理软件的话,还是调用库函数的方式比较好。

图像分析:OpenCV

接下来是图像分析的基础框架,一些高级功能,如对视频流中的人物头像分析提取、轨迹跟踪等,都是需要用到这类基础框架的。

OpenCV是这类框架中比较流行且可靠的,OpenCV一般也称作机器视觉框架,总的来说 ,OpenCV主要的应用场景是图像分析, 更直接的说,就是从图像中提取数据,如人脸识别、轨迹跟踪等。

至于要实现一些AI处理、AI训练的话,需要结合其他AI框架,或者OpenCV的AI特别版本。

但我们还是推荐结合其他AI框架,这样虽然意味着软件结构更加复杂,但是长远来看,对于后续持续升级、功能扩展,专业的框架做专业的事更为合理。

需要特别说明的是:OpenCV的一些API是依赖FFmpeg的,因为图像处理一般是基于视频文件、视频流的,OpenCV需要FFmpeg帮忙解码视频。

另外,OpenCV也可以生成一些较为简单的二维图像,我们就曾经使用OpenCV生成二维实时地图,然后使用FFmpeg将实时地图合成到视频流中。

复杂图像生成:OpenGL

最后是复杂图像生成的基础框架,OpenGL是这类基础框架中较为可靠的,OpenGL比OpenCV能生成更为复杂的图像,OpenGL甚至可以生成3维模型

总结

​虽然我们对FFmpeg、OpenCV、OpenGL是分类介绍的,但是在实际项目当中,并不是非此即彼的选择,很多时候 根据具体场景,是需要同时结合多个框架的。

这里我们想啰嗦一下,也是我们一直坚持的观点:技术或工具都是为了解决某个具体问题而生的,在实际工作中,并不存在一招鲜吃遍天的情况,除非是十年如一日的职位。

但也不需要恐惧一些没使用过的技术,毕竟很多时候,其实并不需要花过多的时间完全掌握某个技术或工具,只需要按我们的需要合理的使用它们的一部分功能就可以了。


http://www.niftyadmin.cn/n/195891.html

相关文章

实战打靶集锦-014-solstice

提示:本文记录了博主的一次失败的打靶经历。 目录1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 ftp服务探查4.2 web服务探查4.3 samba服务探查4.4 smtp服务探查4.5 Squid http proxy服务探查4.6 PHP cli server探查4.7 总结回顾5. 突破边界6. 提权6.1 系统信息…

Java面向对象继承

目录 继承的概念 继承的作用 继承关键字 extends关键字 implements关键字 super 与 this 关键字 继承类型 类的继承格式 继承的概念 继承是面向对象编程中的一个概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类在继承父类的…

linux虚拟机关机、重启命令

一.shutdown 1.shutdown -h now :立即关机 2.shutdown -h 10:53:到10:53关机 3.shutdown -h 10 :10分钟后自动关机 4.shutdown -r :重启(默认30秒) 5.shutdown -r now :立即重启 6.shutdown -r …

线程池参数说明

各个参数讲解: 核心线程数量:参数指定了线程池中保留的核心线程数。在任务数量小于等于核心线程数时,线程池中会一直保留这些核心线程,即使它们处于空闲状态。这样可以避免频繁地创建和销毁线程,提高线程池的效率。当任…

JVM备忘录

1. JVM内存区域划分 JVM(Java Virtual Machine)内存区域主要分为以下几个部分: 程序计数器(Program Counter Register):是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器…

分部积分法习题

前置知识:分部积分法 例题1 计算∫ln⁡xdx\int \ln xdx∫lnxdx 解: \qquad原式xln⁡x−∫xd(ln⁡x)xln⁡x−∫x⋅1xdxx\ln x-\int xd(\ln x)x\ln x-\int x\cdot\dfrac 1xdxxlnx−∫xd(lnx)xlnx−∫x⋅x1​dx xln⁡x−∫dxxln⁡x−xC\qquad\qquad x\ln…

ThreadLocal学习(一)

文章目录一、什么是ThreadLocal二、在项目中使用ThreadLocal一、什么是ThreadLocal ThreadLocal,也就是线程本地变量。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地拷贝,多个线程操作这个变量的时候…

English Learning - L2 第 10 次小组纠音 辅音 [m] [n] [ŋ] 半元音 [w] [j] 2023.3.29 周三

English Learning - L2 第 10 次小组纠音 辅音 [m] [n] [ŋ] [w] [j] 2023.3.29 周三共性问题more Autumn [ɔː] 舌位偏前gone evening 前后鼻音不分Hes proud of this name 双元音缺乏滑动感bank thing 中的后鼻音发成前鼻音week what yolk 元音 [iː] [ɒ] 舌位偏前 [əʊ] …