第7课 利用FFmpeg将摄像头画面与麦克风数据合成后推送到rtmp服务器
上节课我们已经拿到了摄像头数据和麦克风数据,这节课我们来看一下如何将二者合并起来推送到rtmp服务器。推送音视频合成流到rtmp服务器地址的流程如下:
1.创建输出流
//初始化输出流上下文
avformat_alloc_output_context2(&outFormatCtx, NULL, "flv", outFileName);
outFormat = outFormatCtx->oformat;
outFormat->video_codec = AV_CODEC_ID_H264;
outFormat->audio_codec = AV_CODEC_ID_AAC;
2.创建视频编码器
vEncodec = avcodec_find_encoder(AV_CODEC_ID_H264);
vEncodeCtx = avcodec_alloc_context3(vEncodec);
vEncodeCtx->codec_id = vEncodec->id;
vEncodeCtx->codec_type = AVMEDIA_TYPE_VIDEO;
vEncodeCtx->bit_rate = 1000000;
vEncodeCtx->width = backWidth;
vEncodeCtx->height = backHeight;
vEncodeCtx->time_base = { 1, 25 };
vEncodeCtx->framerate = { 25, 1 };
vEncodeCtx->gop_size = 25 * 10;
vEncodeCtx->pix_fmt = *vEncodec->pix_fmts;
vEncodeCtx->max_b_frames = 0;
vEncodeCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
av_dict_set(&vEncodeOpts, "profile", "baseline", 0);
av_dict_set(&vEncodeOpts, "preset", "ultrafast", 0);
av_dict_set(&vEncodeOpts, "tune", "zerolatency", 0);
avcodec_open2(vEncodeCtx, vEncodec, &vEncodeOpts);
3.创建音频编码器
//音频编码器
aEncodec = avcodec_find_encoder(AV_CODEC_ID_AAC);;
aEncodeCtx = avcodec_alloc_context3(aEncodec);
aEncodeCtx->bit_rate = 64000;
aEncodeCtx->sample_rate = 44100;
aEncodeCtx->block_align = 0;
aEncodeCtx->sample_fmt = AV_SAMPLE_FMT_FLTP;
aEncodeCtx->channel_layout = AV_CH_LAYOUT_STEREO;
aEncodeCtx->channels = 2;
aEncodeCtx->time_base.num = 1;
aEncodeCtx->time_base.den = aEncodeCtx->sample_rate;aEncodeCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
avcodec_open2(aEncodeCtx, aEncodec, NULL);
4.创建输出视频流
//创建输出视频流
videoStream = avformat_new_stream(outFormatCtx, vEncodec);
videoStream->id = outFormatCtx->nb_streams - 1;
videoStream->codecpar->codec_tag = 0;
avcodec_parameters_from_context(videoStream->codecpar, vEncodeCtx);
5.创建输出音频流
//创建输出音频流
audioStream = avformat_new_stream(outFormatCtx, NULL);
audioStream->codecpar->codec_tag = 0;
audioStream->id = outFormatCtx->nb_streams - 1;
avcodec_parameters_from_context(audioStream->codecpar, aEncodeCtx);
6.打开输出流并写入文件头
//打开输出流
av_dump_format(outFormatCtx, 0, outFileName, 1);
ret = avio_open2(&outFormatCtx->pb, outFileName, AVIO_FLAG_READ_WRITE, nullptr, nullptr);//写文件头
ret = avformat_write_header(outFormatCtx, NULL);
7.分别封装音视频帧并送入编码器
ret = avcodec_send_frame(vEncodeCtx, deVideoFrame);
ret = avcodec_receive_packet(vEncodeCtx, &enVideoPacket);ret = avcodec_send_frame(aEncodeCtx, deAudioFrame);
ret = avcodec_receive_packet(aEncodeCtx, &enAudioPacket);
8.分别推送音视频流
if (enVideoPacket.size > 0){ret = av_interleaved_write_frame(outFormatCtx, &enVideoPacket);
}if (enAudioPacket.size > 0){ret = av_interleaved_write_frame(outFormatCtx, &enAudioPacket);
}
9.播放测试rtmp流
打开vlc或第一章写好的rtmp播放器测试,对着麦克风说话如果能从播放器听到声音并看到图像说明成功。

相关文章:
第7课 利用FFmpeg将摄像头画面与麦克风数据合成后推送到rtmp服务器
上节课我们已经拿到了摄像头数据和麦克风数据,这节课我们来看一下如何将二者合并起来推送到rtmp服务器。推送音视频合成流到rtmp服务器地址的流程如下: 1.创建输出流 //初始化输出流上下文 avformat_alloc_output_context2(&outFormatCtx, NULL, &…...
Microsoft Visual Studio 2022 install Project 下载慢
1. 关闭Internet 协议版本6 2. 如果没有效果,打开Internet 协议版本4,更改DNS 3. 在浏览器中下载后安装,下载地址如下: Microsoft Visual Studio Installer Projects 2022 - Visual Studio Marketplace 4. 安装时注意关闭vs&…...
uniapp---安卓真机调试提示检测不到手机【解决办法】
最近在做APP,由于华为手机更新过系统,再次用来调试APP发现就不行了。下面给出具体的解决方法: 第一步:打开【允许开发人员选项】 找到【设置】点击【关于手机】找到【版本号】点击7次或多次,允许开发人员选项。 第二…...
Nginx(十四) 配置文件详解 - 负载均衡(超详细)
本篇文章主要讲ngx_http_upstream_module模块下各指令的使用方法。 1. upstream 上游服务器组/集群 Syntax: upstream name { ... } Default: — Context: http upstream指令定义了一个上游服务器组/集群,便于反向代理中的proxy_pass使用。服务器可以监听…...
大数据应用安全策略包括什么
大数据应用安全策略是为了保障大数据应用中的数据安全而采取的一系列措施,其重要性不容小觑。以下是大数据应用安全策略所包含的主要内容: 一、数据加密与安全存储 数据加密:对于敏感数据,应采用加密技术进行保护,包括…...
Ubuntu软件和vmware下载
https://cn.ubuntu.com/download/desktop VMware 中国 - 交付面向企业的数字化基础 | CN...
如何修改Anaconda的Jupyter notebook的默认启动路径
1.打开Anaconda控制台 2.输入下面的命令 jupyter notebook --generate-config 这个命令的作用是生成 Jupyter notebook 的配置文件。如果你是第一次运行,会直接生成这个文件。如果曾经运行过这个命令,就会像下图一样问你时候要覆盖原来的文件。这个时候…...
密码学:带密钥的消息摘要算法一数字签名算法
文章目录 前言手写签名和数字签名前置知识点:消息摘要算法数字签名算法数字签名算法的由来数字签名算法在实际运用的过程附加:签名和摘要值的解释 数字签名算法的家谱数字签名算法的消息传递模型经典数字签名算法-RSA实现 数字签名标准算法-DSA实现 圆曲…...
JVM中部分主要垃圾回收器的特点、使用的算法以及适用场景
JVM中部分主要垃圾回收器的特点、使用的算法以及适用场景: Serial GC(串行收集器) 特点:单线程执行,对新生代进行垃圾回收时采用复制算法(Copying),在老年代可能使用标记-压缩或标记…...
vue保姆级教程----深入了解Vuex的工作原理
📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 CSS专栏:想学CSS的,冲这里 Ǵ…...
(JAVA)-(网络编程)-InetAddress(ip)
InetAddress类就表示ip地址,他是一个接口,有两个实现类:Inet4Address和Inet6Address,分别表示IPv4和IPv6. 创建对象:此类没有对外提供构造方法,创建ip对象要使用InetAddress类的静态方法getByName()。 st…...
手把手带你死磕ORBSLAM3源代码(二十二)Tracking.cc PrintTimeStats介绍
目录 一.前言 二.代码 2.1完整代码 一.前言 这段代码是一个C++函数,名为Tracking::PrintTimeStats(),它属于Tracking类。这个函数的主要目的是计算和打印出各种跟踪和本地映射任务所花费的平均时间和标准差,并将这些信息同时输出到控制台和一个名为ExecMean.txt的文本文件…...
【操作系统xv6】学习记录3-Wsl2 Ubuntu18.04图形化界面
不知道为啥,wls2和windows用vscode ssh的方式连接识别, 既然如此,那就装一个桌面版的,其实2年多前装过一次,后来pc机跑深度学习的任务,硬盘坏了~ 开干前再试一次 ref:https://zhuanlan.zhihu.…...
CCNP课程实验-03-Route_Path_Control_CFG
目录 实验条件网络拓朴需求 基础配置需求实现1.A---F所有区用Loopback模拟,地址格式为:XX.XX.XX.XX/32,其中X为路由器编号。根据拓扑宣告进对应协议。A1和A2区为特例,A1:55.55.55.0/24,A2:55.55…...
STM32 学习(二)GPIO
目录 一、GPIO 简介 1.1 GPIO 基本结构 1.2 GPIO 位结构 1.3 GPIO 工作模式 二、GPIO 输出 三、GPIO 输入 1.1 传感器模块 1.2 开关 一、GPIO 简介 GPIO(General Purpose Input Output)即通用输入输出口。 1.1 GPIO 基本结构 如下图࿰…...
安卓作业001 - 显示学生信息
文章目录 安卓作业001 - 显示学生信息一、界面设计思路二、涉及知识点概览三、实现步骤详解四、启动应用,查看结果五、任务完成总结 安卓作业001 - 显示学生信息 显示学生详细信息要求更改应用图标及标 题要求设置窗口背景图片 一、界面设计思路 在本次安卓作业0…...
ARM CCA机密计算硬件架构之内存管理
实施了TrustZone安全扩展的Arm A-profile处理器呈现两个物理地址空间(PAS): 非安全物理地址空间安全物理地址空间Realm管理扩展增加了两个PAS: Realm物理地址空间Root物理地址空间下图显示了这些物理地址空间以及如何在工作系统中实施这些空间: 正如表格所示,根状态能够访…...
MySQL--安装与配置与向日葵的基本操作使用
一.MySQL介绍 1.1 MySQL简介 MySQL是一个开源的关系型数据库管理系统,最早由瑞典MySQL AB公司开发。这个数据库系统有着高可靠性、高性能和易用性的特点,在互联网上得到了广泛的应用。MySQL支持SQL语言,可以运行在多种操作系统上,…...
Vue - 多行文本“展开、收起”功能
TextClamp 使用 js 实现文本展开、收起,并非纯 CSS 实现。 Props: fontSize:Number,默认:14lines:Number,默认:1lineHeight:Number,默认:20 F…...
Linux操作系统基础(6):Linux的文件颜色
1. Linux文件颜色 在Linux系统中,文件和目录的颜色是通过终端的配置来实现的,不同的颜色代表不同类型的文件或目录。通常情况下,可以通过 LS_COLORS 环境变量来配置文件和目录的颜色。下面是一些常见的颜色及其代表的含义: 白色…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
