学习笔记/音视频面试

1.DTS/PTS

如果没有B帧,那么DTS一般与PTS相同

  • DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。(解码I->P->B)
  • PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

2.GOP

就是将同一组动作的封装为一个组,组内的动作变化不大,可以不用整个图片传输,降低数据量

2.!宏块!

  • 视频压缩操作的基本单元
  • 帧内压缩还是帧间压缩,都是以宏块为单位
  • 细节部分宏块划分小.

3.帧内压缩和帧间压缩(有损压缩)

  1. 帧内压缩:即只利用了单帧图像内的空间相关性,对冗余数据(相同的像素)进行编码,达到压缩效果,而没有利用时间相关性,不使用运动补偿。
    • 用宏块做对比,然后用算法(9种)选择一种,把当前宏块化为一个数字,对面接受后进行反解就可以恢复
    • 亮度和色度分开预测
    • 预测后与原始图求差值,然后一起传输.到那边反解后再加上差值就可以得到相似的原图
    • 只对I帧和IDR帧
  2. 帧间压缩:由于视频的特性,相邻的帧之间其实是很相似的,通常是运动矢量的变化。利用其时间相关性,可以通过参考帧运动矢量的变化来预测图像,并结合预测图像与原始图像的差分,便能解码 出原始图像。所以,帧间编码需要依赖其他帧才能解码出一帧画面。
    • GOP
    • 参考帧
    • 运动估计(宏块匹配 + 运动矢量) : 用宏块匹配的方法找到运动矢量(一个物品变动的方向和位置)
    • 运动补偿(残差值)
    • P帧,B帧

运动矢量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iu2CMqhZ-1646910151758)(音视频面试.assets/image-20220310183137978.png)]

I帧P帧B帧
  • I帧 : 内编码方式, IDR帧(每个GOP中的第一帧),也是I帧
  • P帧,向前参考.大小为I帧的一半
  • B帧,双向参考帧,大小为I帧的1/4
IDR帧与I帧区别
  • IDR 解码立即刷新.

  • 每当遇到IDR帧,解码器就会清空解码器参考buffer中的内容

  • 每个GOP中的第一帧为IDR帧

SPS/PPS

在每个IDR前面,一定有SPS/PPS

  • SPS 序列参数集. 参考帧数量(可以修改一个帧参考多个I帧),帧数,帧场编码模式
  • PPS 熵编码模式,组数目

4.视频花屏/卡顿原因

  1. 花屏原因:如果GOP分组有帧丢失,会造成解码端的图像发生错误,就会出现马赛克(花屏)

  2. 卡顿原因: 为了避免花屏问题的发生,如果发现有帧丢失时,就丢弃整个GOP内的所有帧,

    直到下一个IDR帧重新刷新图像(这段时间就卡顿)

5.DCT帧数离散余弦变化 ,CABAC压缩(无损压缩)

  1. DCT 将空间上的相关性变为频域上无关的数据然后进行量化
    • 就是将一个无序的矩阵化成一个更小的,集中在一个角的矩阵
  2. VLC压缩,类似哈夫曼,用于MPEG2
  3. CABAC压缩(H264),

6.H264码流

1.分层
  • NAL层 : 视频数据网络抽象层(头,类似于TCP头),解决纠错能力.(一个字节的head)
  • VCL层: 视频数据编码层(帧信息,数据)
2.VCL结构

一般都是一个图片一个slice;但是可以包含多个slice

  • slice里面存的是一个个宏块, 宏块中存了 : 宏块类型(9种模式),预测值和残差值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K2OBAX8q-1646910151759)(音视频面试.assets/image-20220310184939890.png)]

3.码流基本概念
  1. SODB(按位计算)
    • 原始数据比特流,长度一定要到8位的倍数.VLC层尝试
  2. RBSP(按字节计算,因为按位可能不是8的整数倍,所有有了这个)
    • SODB + 补充位. 如果SODB最后一个字节如果不对齐,就补1和多个0
  3. NALU
    • NAL Header(1B) + RBSP
4.图.清晰

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JEOrGo1q-1646910151760)(音视频面试.assets/image-20220310185536256.png)]

5.全部码流图
  • startCode : 0x000001,0x00000001;
  • RTP可以直接传输

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w8drGON1-1646910151760)(音视频面试.assets/image-20220310185823833.png)]

7.常用同步策略

  1. 将视频同步到音频上:就是以音频的播放速度为基准来同步视频。

  2. 将音频同步到视频上:就是以视频的播放速度为基准来同步音频。

  3. 将视频和音频同步外部的时钟上:选择一个外部时钟为基准,视频和音频的播放速度都以该时钟为标准。

    当播放源比参考时钟慢,则加快其播放速度,或者丢弃;快了,则延迟播放。

1.选取同步策略

考虑到人对声音的敏感度要强于视频,频繁调节音频会带来较差的观感体验,且音频的播放时钟为线性增长,所以一般会以音频时钟为参考时钟,视频同步到音频上。

2.视频I帧问题(必须等到第一个I帧)

对于起播阶段,特别是TS实时流,由于视频解码需要依赖第一个I帧,而音频是可以实时输出,可能出现的情况是视频PTS超前音频PTS较多,这种情况下进行同步,势必造成较为明显的慢同步。处理这种情况的较好方法是将较为多余的音频数据丢弃,尽量减少起播阶段的音视频差距。

3.同步步骤
  1. 获取当前要显示的video PTS,减去上一帧视频PTS,则得出上一帧视频应该显示的时长delay;
  2. 当前video PTS与参考时钟当前audio PTS比较,得出音视频差距diff;
  3. 获取同步阈值sync_threshold,为一帧视频差距,范围为10ms-100ms;
  4. diff小于sync_threshold,则认为不需要同步;否则delay+diff值,则是正确纠正delay;
  5. 如果超过sync_threshold,且视频落后于音频,那么需要减小delay(FFMAX(0, delay + diff)),让当前帧尽快显示。
    如果视频落后超过1秒,且之前10次都快速输出视频帧,那么需要反馈给音频源减慢,同时反馈视频源进行丢帧处理,让视频尽快追上音频。因为这很可能是视频解码跟不上了,再怎么调整delay也没用。
  6. 如果超过sync_threshold,且视频快于音频,那么需要加大delay,让当前帧延迟显示。
    将delay*2慢慢调整差距,这是为了平缓调整差距,因为直接delay+diff,会让画面画面迟滞。
    如果视频前一帧本身显示时间很长,那么直接delay+diff一步调整到位,因为这种情况再慢慢调整也没太大意义。
  7. 考虑到渲染的耗时,还需进行调整。frame_timer为一帧显示的系统时间,frame_timer+delay- curr_time,则得出正在需要延迟显示当前帧的时间。

8.行对齐问题

//播放内容放置到材质内存空间中,格式为YUV
if (width == frame->linesize[0]) //无需对齐
{
    memcpy(datas[0], frame->data[0], width*height);
    memcpy(datas[1], frame->data[1], width*height / 4);
    memcpy(datas[2], frame->data[2], width*height / 4);
}
else//行对齐问题
{
    for(int i = 0; i < height; i++) //Y 
        memcpy(datas[0] + width*i, frame->data[0] + frame->linesize[0]*i, width);
    for (int i = 0; i < height/2; i++) //U
        memcpy(datas[1] + width/2*i, frame->data[1] + frame->linesize[1] * i, width);
    for (int i = 0; i < height/2; i++) //V
        memcpy(datas[2] + width/2*i, frame->data[2] + frame->linesize[2] * i, width);

}

9.YUV类型

//YUV444
Y0 U0 V0 Y1 U1 V1 ....
    
//YUV420
Y0 Y0 Y1 V0....
 
//YUV420  真正样子为上下隔开 上面均为Y,下面均为u0v0
Y0 Y1 Y2 Y3 Y4 ...
 U0V0  U1V1 ...
Y1 Y1 Y1 Y1 Y1 ...

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQryNMO2-1646910151761)(音视频面试.assets/image-20220310171007178.png)]

10.音频压缩

压缩两个方向: 压缩体积越来越小,或者压缩速度越来越快

1.方法:
  • 有损压缩: 消除冗余信息(人听不到的信息删除)
    • 频域遮蔽(频率不一样,高频率可以遮盖一点范围的低频率声音)
    • 时域遮蔽(越靠近声音时间,遮盖率就越高)
  • 无损压缩: 文件压缩,编码解码
    • 熵编码 : 哈夫曼,算数编码,香农编码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXWIUCG-1646910151761)(音视频面试.assets/image-20220310172301653.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vz0ZXTaw-1646910151761)(音视频面试.assets/image-20220310172413374.png)]

2.编码过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ylz2S5H5-1646910151762)(音视频面试.assets/image-20220310172603131.png)]

2.常见的音频编码器
  1. opus(现在经常用,webrtc,直播等,但是收费)
  2. AAC(应用最广)
  3. speex(可以做回音消除)
  4. G.711(固话)

11.H264编码

1.yuv

YUV有不同的压缩格式,比RGB占用更少的空间.约1.5倍

//YUV420
Y = 1   W * D
H = 1/4 W * D
V = 1/4 W * D
总数 = 1.5 * w * d
 
//RGB
RGB = W * D * 3;
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会尽力回答你的问题。关于通过UDP传输音视频,我了解一些相关的知识,下面是一些学习笔记: 1. gstreamer是一个流媒体框架,用于创建、处理和播放多媒体流。它支持多种音视频格式,可以通过插件扩展功能。 2. 通过gstreamer可以使用UDP协议传输音视频数据。UDP协议是一种无连接的协议,不保证数据传输的可靠性和顺序性,但是传输效率高。 3. 首先需要创建一个gstreamer的pipeline,包括音视频源、编码器、UDP发送端等组件。例如: ``` gst-launch-1.0 -v filesrc location=test.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink host=192.168.1.100 port=5000 ``` 这个pipeline的作用是从test.mp4文件读取音视频流,解码后使用x264编码器进行压缩,然后使用rtph264pay将数据打包成RTP数据包,最后通过udpsink发送到指定的IP地址和端口。 4. 接收端需要创建一个gstreamer的pipeline,包括UDP接收端、解包器、解码器等组件。例如: ``` gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! autovideosink ``` 这个pipeline的作用是从UDP端口5000接收音视频数据,使用rtpjitterbuffer解决网络抖动问题,使用rtph264depay将RTP数据包解包成原始的H.264数据流,然后使用avdec_h264解码器进行解码,最后使用autovideosink播放视频。 5. 在实际使用过程中,还需要考虑数据的带宽限制、网络延迟等问题,以保证音视频传输的效果。 希望这些笔记能对你有帮助。如果你还有其他问题,可以继续问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公仔面i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值