哔哩哔哩
RTSP、RTMP、HLS的区别
1. RTSP(Real Time Streaming Protocol):
○ 用途: 主要用于视频监控和视频会议系统。
○ 特点: 支持暂停、播放、快进等操作,实现了对流媒体的实时控制。
○ 延迟: 低至几百毫秒,适合实时交互。
○ RTMP(Real Time Messaging Protocol):
○ 用途: 初期主要用于Adobe Flash播放器,现在用于直播。
○ 特点: 在传输过程中可以加密,更加安全。
○ 延迟: 较低,适合直播。
○ HLS(HTTP Live Streaming):
○ 用途: 主要用于在线视频平台和OTT(Over The Top)流媒体。
○ 特点: 基于HTTP传输,易于跨平台,且便于跨防火墙和代理服务器传输。
○ 延迟: 较高,通常在几秒到十几秒,但最新的技术进展已能显著减低延迟。
视频编码
常见的视频编码标准包括H.264、H.265、VP9等。
影响编码效率的因素
1. 编码算法:不同编码标准如H.264、H.265的算法复杂性不同,影响效率。
2. 分辨率和帧率:高分辨率和高帧率视频需要更多的数据处理。
3. 码率:码率高时数据量大,编码负荷更重。
4. 内容复杂度:场景复杂多变的视频比静态或重复场景的视频编码难度大。
5. 颜色深度:颜色深度大的视频如10bit比8bit的视频编码更费时。
6. 并发编码算法:硬件加速和多线程技术可以提高编码效率。
7. 压缩方式:使用更高级的压缩技术(如CABAC)可以提升编码效率。
视频延迟来自于哪些方面
1. 采集延迟:摄像头和麦克风捕捉数据的时间。
2. 编码延迟:将原始视频和音频数据编码成数字流的处理时间。
3. 处理延迟:视频图像的预处理、滤镜应用等额外处理步骤。
4. 封装延迟:将编码后的数据打包成特定格式的时间。
5. 网络传输延迟:数据包通过网络从发送者到接收者的时间,包括传播、排队、处理和解包时间。
6. 缓冲延迟:为了平滑网络抖动,在客户端进行的数据缓冲。
7. 解码延迟:客户端将接收的数据流解码为可播放的视频和音频的时间。
8. 播放延迟:视频渲染和播放的等待时间。
开源流媒体服务器了解吗
1. SRS - 简单高效的RTMP/HLS直播服务器。
2. Nginx-RTMP - 基于Nginx开发的RTMP流媒体服务器。
3. Red5 - 使用Java开发的流媒体服务器,支持多种流媒体协议。
4. MediaSoup - 针对WebRTC的高性能SFU服务器。
5. Janus - 实时通信服务器,支持WebRTC等多种协议。
编码的参数有哪些
1. 比特率(Bitrate):编码时的数据传输速率,直接影响视频和音频质量。
2. 帧率(Frame Rate):每秒显示的图片数,影响视频流畅度。
3. 分辨率(Resolution):视频的宽度和高度,影响视频清晰度。
4. 编码格式(Codec):影响文件兼容性,如H.264, H.265等。
5. GOP(Group of Pictures):影响I帧(关键帧)的频率,进而影响视频可寻址性和压缩效果。
I帧、P帧、B帧
I帧:关键帧,独立编码,不依赖其他帧。P帧:向前预测帧,依赖前面的I帧或P帧进行编码。B帧:双向预测帧,依赖前后帧进行编码,压缩率最高。
多态
C++的多态是通过指向基类的指针,来调用实际子类的方法,让不同的子类对象可以执行各自的操作。多态主要包括虚函数(动态多态)和函数重载(静态多态)两种形式。
手撕大小端转换
1. 掩码并取得各个字节。
2. 通过移位把字节放到相反位置。
3. 组合这些字节得到最终结果。
[C++] 纯文本查看 复制代码 uint32_t swapEndian(uint32_t value) {
return ((value & 0x000000FF) << 24) |
((value & 0x0000FF00) << 8) |
((value & 0x00FF0000) >> 8) |
((value & 0xFF000000) >> 24);
手撕合并区间
1. 对区间按照起始位置进行排序。
2. 遍历排序后的区间列表,逐一判断当前区间是否可以与结果数组的最后一个区间合并:
○ 如果可以合并(当前区间的起始位置小于或等于结果数组最后一个区间的结束位置),则更新结果数组最后一个区间的结束位置为两个区间结束位置的较大值。
○ 如果不可以合并,直接将当前区间加入到结果数组中。
[C++] 纯文本查看 复制代码 #include <vector>
#include <algorithm>
std::vector<std::vector<int>> mergeIntervals(std::vector<std::vector<int>>& intervals) {
if (intervals.empty()) return {};
std::sort(intervals.begin(), intervals.end()); // 按区间起始位置排序
std::vector<std::vector<int>> merged;
for (const auto& interval : intervals) {
// 如果结果数组为空,或当前区间与结果数组最后一个区间不重叠,直接添加
if (merged.empty() || merged.back()[1] < interval[0]) {
merged.push_back(interval);
}
// 否则,合并当前区间与结果数组最后一个区间
else {
merged.back()[1] = std::max(merged.back()[1], interval[1]);
}
}
return merged;
}
|