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

C++ 音视频原理

本篇文章我们来描述一下音视频原理

音视频录制原理:

下面是对这张思维导图的介绍 

摄像头部分:

麦克风采集声音 摄像头采集画面

摄像头采集回来的数据可以用RGB也可以用YUV来表示  

图像帧帧率 一秒能处理多少张图像

图像处理 :调亮度

图像帧队列 :意思是将数据取出来储存在图像帧队列里面 等着编码器将数据取出来进行编码处理 进行压缩

视频编码 将视频体积大变成小的 精简的

视频包队列:压缩好的(编程好的)音频作为音频包队列 然后按照一定的规则封装成文件

麦克风部分:

麦克风采集声音 摄像头采集画面

采样帧 :PCM 采集多少数据作为一帧来压缩

音频处理:类似于变声器的概念 变音

采样帧队列:把数据放到队列里面 等待音频编码线程来读取

音频编码:声音也要进行压缩 将声音进行压缩

音频包队列:压缩完的声音队列  

复用器:音视频队列都按照一定的规则写到文件里面去

时钟用于将音视频同步(相同的时间戳) 如果没有音视频同步 还怎么看视频 

音视频播放原理:

下面是对这个思维导图的介绍:

解复用器:将媒体文件分离成音频包队列和视频包队列 根据媒体文件的相应的规则来分离 比如媒体文件是mp4规则就用mp4规则来分离 

音频包队列意思就是说音频消息的存储 为二进制 等待解码

音频包队列意思就是说视频消息的存储 为二进制  等待解码

放在帧队列然后时钟音视频同步(注意是逐帧播放)

音视频原理代码实例:

#include <opencv2/opencv.hpp>int main() {cv::VideoCapture cap(0); // 打开默认摄像头if (!cap.isOpened()) {std::cerr << "无法打开摄像头" << std::endl;return -1;}int frameWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH);int frameHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT);cv::VideoWriter writer("output.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 25.0, cv::Size(frameWidth, frameHeight));if (!writer.isOpened()) {std::cerr << "无法创建视频文件" << std::endl;return -1;}while (true) {cv::Mat frame;cap >> frame; // 从摄像头读取帧writer.write(frame); // 写入视频文件cv::imshow("Video", frame); // 显示实时视频if (cv::waitKey(1) == 'q') { // 按下'q'键退出循环break;}}cap.release(); // 释放摄像头资源writer.release(); // 关闭视频文件return 0;
}

这段代码使用FFmpeg库打开输入视频文件,创建输出RTMP流地址,并将音视频数据推送到流媒体服务器

总结:我们学习播放器的时候 首先要了解他的一个总体的思维导图 然后在逐个击破 这样效果才是最好的  音视频录制和音视频播放的是互逆的操作  还要注意 帧队列通常和时钟相互使用 帧队列精度高 配合时间使用实现音视频同步

好了 本篇文章就到这里结束了 在这里向大家推荐一个课程:

https://xxetb.xetslk.com/s/2PjJ3T

相关文章:

  • 跟着pink老师前端入门教程(JavaScript)-day02
  • OpenAl 视频生成模型 —— Sora技术报告解读
  • Excel模板2:进度条甘特图
  • 你逛过凌晨四点的校园吗?2023年终总结
  • 蓝桥杯刷题--python-7
  • 蓝桥杯电子类单片机提升一——超声波测距
  • 智慧供应链控制塔大数据解决方案
  • 【从Python基础到深度学习】 8. VIM两种状态
  • MySQL双写机制
  • 网络原理-TCP/IP(7)
  • 基于MapVGL的地理信息三维度数据增长可视化
  • 网络安全产品之认识蜜罐
  • 第五章:变换矩阵
  • [职场] 会计学专业学什么 #其他#知识分享#职场发展
  • Python访问数据库
  • 【css3】浏览器内核及其兼容性
  • angular2开源库收集
  • css选择器
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • PHP面试之三:MySQL数据库
  • Python学习之路16-使用API
  • SpiderData 2019年2月23日 DApp数据排行榜
  • TypeScript迭代器
  • windows下mongoDB的环境配置
  • windows下使用nginx调试简介
  • 初探 Vue 生命周期和钩子函数
  • 关于Flux,Vuex,Redux的思考
  • 诡异!React stopPropagation失灵
  • 京东美团研发面经
  • 聊聊directory traversal attack
  • 日剧·日综资源集合(建议收藏)
  • 设计模式走一遍---观察者模式
  • 数据科学 第 3 章 11 字符串处理
  • 最近的计划
  • Java性能优化之JVM GC(垃圾回收机制)
  • scrapy中间件源码分析及常用中间件大全
  • 阿里云API、SDK和CLI应用实践方案
  • 如何正确理解,内页权重高于首页?
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ###C语言程序设计-----C语言学习(3)#
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (a /b)*c的值
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (javascript)再说document.body.scrollTop的使用问题
  • (分布式缓存)Redis哨兵
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (转)jQuery 基础
  • (转)甲方乙方——赵民谈找工作
  • .naturalWidth 和naturalHeight属性,
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)