当前位置: 首页 > news >正文

第5课 使用openCV捕获摄像头并实现预览功能

这节课我们开始利用ffmpeg和opencv来实现一个rtmp推流端。推流端的最基本功能其实就两个:预览画面并将画面和声音合并后推送到rtmp服务器。

一、FFmpeg API 推流的一般过程

1.引入ffmpeg库:在代码中引入ffmpeg库,以便使用其提供的功能。

2.捕获摄像头:使用openCV捕获摄像头画面数据备用。

3.捕获麦克风:使用windows API捕获麦克风数据备用。

4.创建输出上下文:使用avformat_alloc_output_context2()函数创建输出上下文,并设置输出格式。

5.添加输出流:根据输入文件的流信息,使用avformat_new_stream()函数创建输出流,并将其添加到输出上下文中。

6.设置编码参数:为输出流设置编码参数,包括编码器、编码器参数等。

7.输出文件:使用avio_open()函数打开输出文件,并将输出文件的相关信息存储在输出上下文中。

8.写入文件头:使用avformat_write_header()函数写入输出文件的文件头。

9.转码推流:循环读取音频频帧进行编码后使用av_interleaved_write_frame()函数将编码后的数据包写入输出流。

10.写入文件尾:使用av_write_trailer()函数写入输出文件的文件尾。

11.释放资源:释放所有的上下文、流和其他资源,使用avformat_close_input()函数关闭输入文件。


二、捕获摄像头画面并预览

1.解压缩第一节课的demo1.rar,并修改工程文件夹demo1为demo5,及时备份源文件并在原基础上继续迭代开发是一种好习惯。

2.为了与上节课的播放功能区分,新建或直接复制fmlp(Flash Media Live Player)类为一个新的fmle(Flash Media Live Encoder)类,并修改主对话框相应代码使fmle能正常工作。

修改如下:

//#include "fmlp.h"
#include "fmle.h"//fmlp *myFmlp = new fmlp();
fmle *myFmle = new fmle();

3.在fmle.cpp的init函数中新开线程打开摄像头并预览:

int fmle::init()
{capCamHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)capCamThread, (LPVOID)this, 0, NULL);return 0;
}
DWORD WINAPI fmle::capCamThread(LPVOID lpParam) {fmle *pThis = (fmle*)lpParam;	pThis->capCam();return 0;
}int fmle::capCam() {videoCap.open(0);cv::Mat camMat;while (true){if (!videoCap.isOpened()){Sleep(1);continue;}BOOL ifSuccess = videoCap.read(camMat);if (camMat.empty()){Sleep(1);continue;}if (!camMat.empty()){cv::imshow("video", camMat);cv::waitKey(10);}}camMat.release();return 0;
}

如果弹出video对话框并显示摄像头图像则表示成功。

4.参考第2课将图像显示到程序主对话框,为了与播放器区分,新方法命名为drawMatOfPub,在主对话框显示摄像头图像则表示预览成功。

http://www.lryc.cn/news/271397.html

相关文章:

  • Python3操作Json文件碰到的几个问题
  • Java中的自定义异常处理:业务异常类的创建与使用
  • 微信小程序有几个文件
  • 计算机网络:知识回顾
  • 【Python百宝箱】音韵探奇:探索Python中的音频与信号魔法
  • springboot(ssm农产品直卖平台 农产品商城系统Java系统
  • C#编程-使用条件构造
  • 【BERT】深入理解BERT模型1——模型整体架构介绍
  • 【Java开发岗面试】八股文—设计模式
  • GO基础进阶篇 (九)、临界资源安全问题(锁、channel)
  • Python基础-04(比较运算符、逻辑运算符)
  • MySQL 四种插入命令及其特点与锁机制
  • AKShare学习笔记
  • A星寻路算法
  • QDialog
  • Spark中使用DataFrame进行数据转换和操作
  • windows11新装机,简单评测系统自带软件(基本涵盖日常所需应用)
  • 概念解析 | Shapley值及其在深度学习中的应用
  • ajax的完整写法——success/error/complete+then/catch/done+设置请求头两种方法——基础积累
  • 《Linux详解:深入探讨计算机基础》
  • HarmonyOS 实践之应用状态变量共享
  • ThreadLocal共享变量
  • 前端crypto-js 库: MD5
  • 2024新年快乐
  • OpenCV-Python(21):轮廓特征及周长、面积凸包检测和形状近似
  • 连接progressql报错Cannot load JDBC driver class ‘org.postgresql.Driver‘,亲测有效!!!
  • SQLAlchemy快速入门
  • java 纯代码导出pdf合并单元格
  • Linux自己的应用商店yum
  • 集成电路模拟设计——【基于Serdes 应用的 串化/解串器 时钟与数据恢复电路CDR】