C++音视频开发从放弃到入门(基于FFmpeg+OpenCV)

2023-10-28

前言

音视频开发一定要学C++吗?答案是肯定的。虽然其它语言也能搞音视频开发,甚至使用起来更简单,但“语言越高级,离真相就越远”,当你的功能需求日益增多,程序的性能需求越来越迫切,你想进一步了解程序实现的细节时,使用其它语言往往会面临“无法解决”的困境,最后不得不使用C++来解决问题,我们何不从一开始就使用C++呢?

FFmpeg及OpenCV是开源、跨平台的音视频开发SDK,搞音视频开发基本都需要用到它。因为C及C++都是跨平台的开发语言,因此,基于C和C++开发的FFmpeg+OpenCV应用代码只需做少量修改就可以从一个平台移植到另一个平台而无需担心性能有所下降,如从PC移植到Android就是如此。下面的应用都是基于这个思想开发的,开发的原则就是用最少的代码实现最核心的功能,方便使用者二次开发,方便跨平台移植。

FFmpeg做音视频开发主要涉及的业务需求有:推流、拉流、双向音视频交流如视频会议等,推流从简单的推摄像头和麦克风到比较复杂的推桌面和混音,播流从简单的播mp4到比较复杂的播rtmp流或rtsp流等,推播混合从一对一音视频通讯到多对多音视频通讯等。由于C及C++的跨平台特性,基本可以实现"Write once to anywhere"的理想。有了FFmpeg为什么还要拉上OpenCV呢?因为OpenCV有图像处理上的优势,而且现在很多人工智能应用都与OpenCV息息相关,将两者结合起来能生发出很多有实际意义的应用。

开发工具用的VS2013,因为它在老机器上也能跑的很好。界面用的MFC,选择MFC的原因就是因为它快,比其它任何一种UI框架都快,而且我们的学习重点并不是在UI上。为了美化UI,笔者试了很多UI框架,总之该试的都试过了,包括QT,但就慢那么一点点就成为放弃的理由,MFC自绘反而更容易上手。利用MFC的自绘功能,做个类似QQ的UI也不是什么难事儿,这也是微软多年不更新MFC的原因吧,当然QT设计UI更方便,我们这里基本只关注核心功能的实现,从VS移植到QT甚至Android的时候核心代码基本没太大改变。

当然,要搞好这些开发也需要开发者付出艰辛的努力,C和C++的学习成本比其它语言高许多,FFmpeg的移植和高效稳定使用也需要开发者细心调试。笔者在学习过程中,由于C++和FFmpeg实在太难以理解曾无数次放弃又无数次重新拾起来,最后才慢慢入门,因此,本教程名字就叫做《C++音视频开发从放弃到入门》吧。

第一章 从播放器开始

1.配置FFmpeg+OpenCV开发环境

2.用FFmpeg连接rtmp服务器

3.获取并显示视频流

4.获取并播放音频流

5.硬解的实现

第一章案例:

RTMP播放器(软解版)

RTSP播放器(软解版)

RTSP播放器(硬解版)

第二章 在播放器基础上实现转推功能

1.读取本地MP4文件并显示

2.将MP4转推到RTMP服务器

3.将RTSP流转推到RTMP服务器

第二章案例:

多路转码工具

第三章 桌面共享功能的实现

1.捕获桌面图像数据并实现预览功能

2.捕获扬声器数据并推送到rtmp服务器

3.实现麦克风与扬声器混音功能

4.实现桌面与摄像头叠加

5.实现桌面与rtsp摄像头叠加

第三章案例:

桌面共享工具(软编版)

桌面共享工具(DXGI硬编版)

 第四章 将推流端和播放端合并为一对一视频聊天

1.实现一对一音视频聊天功能

2.回声抑制(3A)的实现

第四章案例:

FlashMeeting(回声抑制)

第五章 将工程移植到Android端

1.配置安卓端FFmpeg+OpenCV开发环境

2.实现安卓端rtmp播放器

3.实现安卓端屏幕共享并推送到RTMP服务器

4.推送手机麦克风及扬声器数据

第五章案例:

Android手机屏幕RTMP推流工具(推麦克风版)

Android手机屏幕RTMP推流工具(推扬声器版)

Android系统RTMP播放工具

第六章 拉取RTSP摄像头流并加入AI(人工智能)

1.有人经过时的检测

2.广告的触发播放

3.手势检测

4.动作检测

第六章案例:

智能广告大屏(可叠加透明广告)

空中画板

第七章 RTSP虚拟摄像头

1.虚拟摄像头的实现原理

2.引入RTSP或RTMP源

3.给摄像头加上声音

第七章案例:

1080P虚拟摄像头的实现

第八章 PC端与WEB端实现通讯

1.iocp服务端实现

2.PC客户端与WEB播放端文本聊天及表情的实现

3.PC客户端推送音视频到服务器WEB端RTC播放器实现

第八章案例:

多对多聊天系统的实现

其他案例

PC端软件:

1.
桌面共享工具(RTMP推流工具、投屏工具、播放工具)EXE,非源码)(水印版,不喜勿下)_rtmp推流软件-直播技术文档类资源-CSDN下载

2.播放rtmp流,显示图像+播放声音。

3.一对一音视频对话webRTC实时回声抑制(AEC+AGC+ANS)范例。

安卓手机端软件:

1.Android下ffmpeg+opencv开发模板(Eclipse版本)

2.推屏幕+麦克风到rtmp服务器

3.播放rtmp流,显示图像+播放声音

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++音视频开发从放弃到入门(基于FFmpeg+OpenCV) 的相关文章

随机推荐

  • java线程安全问题分析、3种解决办法

    目录 一 线程不安全 1 1 代码 1 2 解析 解析 卖出不存在的票 解析 卖出相同的票 1 3 解决办法 二 解决方法1 同步代码块 2 1 代码 2 2 解析 三 解决方法2 同步方法 3 1 代码 3 2 说明 四 解决方法3 Lo
  • php如何实现mac端重签ipa,mac用终端对ipa包重新签名

    一年前写过一个用命令行对安卓的apk包重新签名的文章 网上是让用IResin这个软件 但是我用了总是重签名失败 报错warning resource rules has been deprecated in Mac OSX gt 10 10
  • Qml-------ApplicationWindow

    QML内的窗口元素 ApplicationWindow和window 此文章讲解一下ApplicationWindow的基础使用 导入模块 QtQuick Controls qt两个模块的定义与使用方法 import QtQuick Con
  • std::jthread与std::thread区别

    std jthread是C 20新引入的线程类 与 std thread 类似 或者说 jthread是对thread进一步的封装 功能更强大 std jthread的 j实际上是 joining的缩写 众所周知 std thread在其生
  • 创建线程的第一种方式:继承Thread类(含Thread类部分源码解析)

    创建线程的第一种方式 继承Thread类 定义一个类 继承Thread类 重写Thread类中的run方法 创建Thread类的实现类的对象 利用该对象调用Thread类中的start方法 运行结果 好了 接下来我们看源码 首先我们看一下T
  • gcc命令中参数c和o混合使用的详解

    操作系统 windows xp 软件 msys 编译器 gcc gcc c a c 编译成目标文件a o gcc o a a o 生成执行文件a exe gcc a c 生成执行文件a exe gcc o a c a c 编译成目标文件a
  • qml添加qmldir文件步骤

    1 写自定义控件 2 编写qmldir文件 3 在pro文件中添加模块路径 4 在mian cpp中加载qml之前添加模块路径 5 qml中引用自定义qml模块 6 效果如图 参考 参考 https blog csdn net qq 165
  • 机器学习量化应用:用回归策略预测价格

    我们已经知道 监督学习主要就是分类和回归两种方法 本文以支持向量机 support vector machine SVM 来说明 如何采取机器学习中回归方法来预测股票价格 这在传统量化中是根本不可能实现的 在机器学习领域却能达到50 以上的
  • 【QT专栏】QT中实现多线程的四种方式和线程同步

    目录 一 继承QThread 1 基本概念 2 操作流程 二 继承QObject 推荐 1 基本概念 2 操作流程 三 继承QRunnable 配合QThreadPool实现多线程 1 外界通信 2 QMetaObject invokeMe
  • ARM NOEN vfmaq_laneq_f32与vextq_f32指令例子

    vfmaq laneq f32是乘法运算相关指令 vextq f32是取数据相关指令 具体功能用文字描述比较麻烦 直接看个列子一下就懂了 所以在这里记录下来 float32x4 t sum vdupq n f32 0 sum 0 0 0 0
  • element的table组件二次封装,实现动态表头

    封装element的table组件 让其实现动态表头 由于后端传递过来的数据是表头跟数据分开的 而element的table组件是固定死表头的 跟ant design不一样 这怎么搞 只能自己二次封装了 封装思路 1 参照ant desig
  • p5.js炫酷背景动态js特效代码

    下载地址 p5 js炫酷背景动态特效代码 dd
  • 生产管理系统MES详细功能介绍

    MES通过集成各种功能模块 实现了生产过程的全面监控 优化和管理 MES系统在生产过程中被广泛应用 彻底改变了传统的生产方式 MES系统主要有哪些功能模块呢 小编将为大家详细介绍 实时数据采集与监控 MES系统通过连接各种传感器和设备 实时
  • C++开发环境搭建_Visual Studio

    环境搭建步骤 l 下载软件 l 安装软件 l 运行软件 1 下载软件 在百度搜索 visual studio 选择 如下图中的选项 进入Visual Studio 官网后 选择 下载Windows版 并选择Community 2017 社区
  • javafx集成Sqlite工具类,包含增删改查范例

    javafx集成Sqlite工具类 包含增删改查范例 技术分享交流 qq群 835259695 package com hq utils import com hq database entity CollectionBox import
  • 算法练习:707 设计链表(2022-09-23)

    707 设计链表 来源 力扣 LeetCode 链接 https leetcode cn problems design linked list 设计链表的实现 您可以选择使用单链表或双链表 单链表中的节点应该具有两个属性 val和next
  • SmartImageView的简单使用

    SmartImageView主要是为了加速从网上加载图片 支持根据URL地址加载图片 支持异步加载图片 支持图片缓存等 下载地址 http loopj com android smart image view 下载完成后拷贝到项目下的lib
  • nginx反向代理解决vue打包后运行产生的跨域问题

    代理简介 正向代理 客户端明确服务端地址 服务端接收请求时只清楚来自哪个代理服务 反向代理 隐藏服务端信息 访问者并不知道自己访问的时一个地址 反向实现 1 下载nginx 2 修改nginx conf文件 server server 监听
  • 解析excel的坑

    1 解析excel的时候因调用的方法不同导致解析excel的时候数据有时会少一行 hssfSheet getLastRowNum 最后一行行标 比行数小1 hssfSheet getRow k getLastCellNum 获取列数 比最后
  • C++音视频开发从放弃到入门(基于FFmpeg+OpenCV)

    前言 音视频开发一定要学C 吗 答案是肯定的 虽然其它语言也能搞音视频开发 甚至使用起来更简单 但 语言越高级 离真相就越远 当你的功能需求日益增多 程序的性能需求越来越迫切 你想进一步了解程序实现的细节时 使用其它语言往往会面临 无法解决