C++ 音视频原理

简介: 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

相关文章
|
5月前
|
编译器 Linux C语言
我的C++奇迹之旅相遇:支持函数重载的原理
我的C++奇迹之旅相遇:支持函数重载的原理
|
4月前
|
存储 自然语言处理 安全
C++ STL标准库 《string原理与实战分析》
C++ STL标准库 《string原理与实战分析》
70 0
|
5月前
|
小程序 编译器 Linux
C++ 异常原理:以一个小程序为例
作者在调查某个 bug 时涉及到 C++ 异常,借此机会以本文把 C++ 异常机制梳理清楚供大家参考。
|
2月前
|
存储 编译器 C++
C++多态实现的原理:深入探索与实战应用
【8月更文挑战第21天】在C++的浩瀚宇宙中,多态性(Polymorphism)无疑是一颗璀璨的星辰,它赋予了程序高度的灵活性和可扩展性。多态允许我们通过基类指针或引用来调用派生类的成员函数,而具体调用哪个函数则取决于指针或引用所指向的对象的实际类型。本文将深入探讨C++多态实现的原理,并结合工作学习中的实际案例,分享其技术干货。
55 0
|
4月前
|
大数据 C++ 索引
C++ STL标准库 《vector向量原理与实战分析》
C++ STL标准库 《vector向量原理与实战分析》
42 0
|
4月前
|
C++ 容器
C++ STL标准库 《queue单向队列原理与实战分析》
C++ STL标准库 《queue单向队列原理与实战分析》
39 0
|
5月前
|
设计模式 算法 C++
【C++】STL之迭代器介绍、原理、失效
【C++】STL之迭代器介绍、原理、失效
111 2
|
5月前
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。
110 1
|
5月前
|
编译器 C++ 容器
C++模板的原理及使用
C++模板的原理及使用
|
5月前
|
算法 Unix Linux
快速了解C++17 std:: filesystem的原理和使用
快速了解C++17 std:: filesystem的原理和使用
251 4
下一篇
无影云桌面