由于压缩处理的方式不同,视频中的画面帧就分为了不同的类别,其中包括:I 帧、P 帧、B 帧。I 帧是内部编码帧(也称为关键帧),P 帧是前向预测帧(前向参考帧),B 帧是双向内插帧(双向参考帧)。 简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。如果没有 I 帧,P 帧和 B 帧就无法解码。 B 帧 B 帧(Bi-directional predicted frames),B 帧图像采用双向时间预测,可以大大提高压缩倍数。 值得注意的是,由于 B 帧图像采用了未来帧作为参考,因此 MPEG-2 编码码流中图像帧的传输顺序和显示顺序是不同的。 解码也是按接收到的视频流去解,接收一帧解码一帧,解码顺序: IPBBB 而解码顺序和显示顺序不同,我们需要按 PTS 重新调整解码后的帧,即: I B B B P PTS: 12345 DTS:
1)什么是I帧、P帧、B帧?2)什么是IDR帧?与普通I帧有何区别?3)什么是GOP?gop_size值如何设置画质会更好?4)OpenGOP & CloseGOP表示什么? I帧特点:1)I帧是一个全帧压缩编码帧;2)解码时仅用I帧的数据就可重构完整图像;3)I帧描述了图像背景和运动主体的详情;4)I帧不需要参考其他画面而生成;5)I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量 P帧:predictive-frame,前向预测编码帧。通过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像,也称为预测帧。 P帧特点:1)P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);2)解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;3)P帧属于前向预测的帧间编码,它只参考前面最靠近它的 B帧特点:1)B帧是由前面的I或P帧和后面的P帧来进行预测的;2)B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;3)B帧是双向预测编码帧;4)B帧压缩比最高,因为它只反映参考帧间运动主体的变化情况
在视频压缩编码中,所有的帧被分成了三个种类,I帧,B帧和P帧,其实就是Intra-Prediction帧,Bi-prediction帧和Prediction帧。 顾名思义,就是帧内预测帧,双向预测帧以及(单向)预测帧。 (inter prediction),帧内预测的话就是在找参照块的时候,只在当前帧内寻找;而帧间预测的话,找参照块的时候会在相邻的帧之间去找相似块。 因此,基于上述所说, 如果说当前帧是只在当前帧内寻找参照块的话,那么该帧就是I帧 如果在已经编码的帧里面寻找参照块的话,那么它是P帧 如果既在已编码的帧里去寻找参照块,又在未来将要被编码的帧里去寻找参照块的话 ,那么该帧就是B帧。
如果我想用现代视频编码器(如H.264或HEVC)压缩帧2,我会这样做: 1.将视频分解为多个像素块(宏块),并逐一压缩。 2.为了压缩每个宏块,首先在当前帧和前后帧中搜索,找到与我们想要压缩的宏块相似的宏块。 3.记录最佳匹配的宏块的位置(位于哪一帧以及在该帧中的位置)。 如果要压缩帧2中的宏块(已用红色方框标记),你认为最佳方法是什么?该怎么做? 1.首先,我可以查看帧1,并找到相匹配的宏块。 它似乎移动了一个帧宽(我知道要少一些)的距离,并与帧2中像素块的高度大约相同。好的,运动矢量出现了。 2.我在同一帧内搜索,并很快发现,位于红色方框标记的宏块与上方的宏块相同。 按照解码顺序,解码器先解码帧1(I帧),然后是帧2(P帧)。但它却无法显示帧2,因为在解码顺序中的实际上是帧4!所以,解码器需要将帧2(按解码顺序)放入缓冲区,然后等待显示它的时机。
前两天检测网站,发现有条连接的前边出现了一个空格,还删不掉,用 F12 看了下出现了一个 u200B 的字符,非常古怪。 没怎么仔细研究,直接替换了事。 ($(".XX").text()).replace(/u200B/g,'')
OBS推流平台是我们做桌面推流直播经常会用到的推流工具,也有用户将OBS平台和EasyDSS平台结合起来,搭建线上课堂方案,关于如何使用OBS,大家可以通过下文参考一下:如何使用OBS推流平台进行转推。 分析现场后,得知客户是使用 OBS 推送文件到系统中,该文件中包含 B 帧,因此需要在推流端设置不包含B帧,即可解决该问题。 OBS默认的输出模式如下: 默认的输出模式为简单模式,首先修改输出模式为高级。 如下图: 然后在配置(Profile)中选择“baseline”,位置如下图: 点击确定后,即可成功设置,推送的 rtmp 流即可不包含B帧,客户端播放也不再卡顿。
P帧:P帧指的是前向参考帧,它需要参考前一帧的图片才能够正确把数据解码出来。 B帧:B帧指的是双向参考帧,它需要参考前一帧数据和后一帧数据才能够正常把数据解码出来。 P帧:P帧又称之为前向参考帧,此帧的特点是需要参考前一帧的图像信息才可以正确把图像解码出来。P帧指的是这一帧和前一帧的差别,并通过将图像序列中已经编码后的冗余信息充分去除来压缩传输数据量的编码图像。 B帧:B帧也称之为双向参考帧,B帧的特点是以前面的帧(I帧或者P帧)或者后面的帧(也是I帧、P帧)作为参考帧找出B帧的预测值,并且取预测差值和预测矢量进行传送。 所以在拉流端解码B帧的时候不仅需要获得前面的缓存视频,还需要获得后面的缓存视频才能够正常解码B帧。所以,B帧虽然压缩率更高,但是更消耗CPU资源。 通常来说,I帧所占用的字节和体积大于P帧、而P帧所占用的字节大于B帧。所以在码率不变的情况下,可以调整GOP的长度去改善画质,GOP的长度越长,所得到的P帧和B帧更多,画面的质量和细节就会更好。
必备软件及网站我们这次的教程是以 teams,B 站(哔哩哔哩)还有 OBS 为主的,所以在开始之前希望大家可以安装好 teams 还有 OBS 并注册一个 B 站的直播账号。 站: https://www.bilibili.com/软件和 B 站的注册我就不在这里写了,大家可以自行摸索一下,很简单的。 基础设置打开 B 站的,把鼠标放在右侧的头像上,应该可以看到如下画面点击直播中心然后点击我的直播间将直播分类还有房间标题选择好就可以点击开始直播了。 OBS 配置打开 OBS 你应该看到如上图界面。我们点击设置按钮,会看到如下画面最为初学者,不建议大家过多修改这些内容,我们关系的是推流那个选项。 我们点击推流选项会看到如下画面服务:选择自定义服务器: 将 B 站的 rtmp 地址粘贴进来串流密码:将 B 站的直播码粘贴进去完成以上操作后,恭喜你已经完成了开播的 80%的任务了。
mpeg4的每一帧开头是固定的:00 00 01 b6,那么我们如何判断当前帧属于什么帧呢?在接下来的2bit,将会告诉我们答案。 注意:是2bit,不是byte,下面是各类型帧与2bit的对应关系: 00: I Frame 01: P Frame 10: B Frame 为了更好地说明,我们举几个例子,以下是16 进制显示的视频编码: 00 00 01 b6 10 34 78 97 09 87 06 57 87 …… I帧 00 00 01 b6 98 …… B帧 下面我们来分析一下为什么他们分别是I、P、B帧 0x10 = 0001 0000 0x50 = 0101 0000 0x96 = 1001 0100 大家看红色的2bit,再对照开头说的帧与2bit的对应关系,是不是符合了呢?
of Pictures ) 的 第一帧 , 画面组 内 还有 P 帧 和 B 帧 ; I 帧 是 P 帧 和 B 帧 的 参考帧 ; I 帧 的 质量 决定了 同组 P 帧 和 B 帧 解码后的 一系列 画面帧 质量 ; I 帧 在 图像序列 中 周期性 出现 , 出现的频率 由 编码器 选择 ; I 帧 没有 " 运动矢量 " 概念 , 不需要考虑 运动矢量 情况 ; 2、I 帧 - 关键帧压缩法 ; 如 : 压缩效果达到 6:1 ; " 关键帧压缩法 " 可以有效地去除 视频的 " 空间冗余信息 " ; 三、 P 帧 - 前向预测帧 1、P 帧简介 P 帧 全称 " 前向预测帧 ( Predicted , 不能参考 B 帧 ; 只记录 不同点 , 这样可以 充分去除 图像序列 中 前面已编码帧 的 时间冗余信息 来压缩传输数据量的编码图像 P 帧 又被称为 " 预测帧 " ; P 帧 中的 图像数据并不是完整的 P1 帧 , 但是 如果 P2 帧 与 P1 帧 出现颠倒 , 解码出来的视频信息 , 就会出现部分区域乱码或马赛克 ;
pexels-photo-160107.webp.jpg 企业与企业之间的电子商务模式除了B2B之外,还有B2B2B的电商模式。 【数商云】通过在商业合作与实践中,接触到的各行业B2B、B2B2B企业需求,总结关于B2B与B2B2B的电商模式区别一文,借此希望可以解答企业用户关于两者的各类疑问。 B2B与B2B2B各自定义 B2B定义 B2B是企业对企业之间的营销关系。电子商务是现代B2Bmarketing的一种具体主要的表现形式。 B2B2B定义 B2B2B:生厂商——渠道商——消费者企业,供职的客户主体都是企业。与B2B的模式相比,B2B2B在世界范围内应用的比较少,他把广大散户排除在外。 B2B向B2B2B系统模式转化的条件 能够由B2B系统模式转化为B2B2B系统模式的产品必须是可标准化的,可以批量引进、批量销售,而无需根据不同客户的需求进行个性化的定制。
一、B 帧 - 双向内插帧 1、B 帧简介 B 帧 全称 " 双向内插帧 ( Bi-directional Predicted Frames ) " , 采用 双向预测编码方式 , 也就是 B 帧 记录的是 本帧 B 帧 与 前后 I 帧 或 P 帧 的差别 ; 注意 : B 帧 需要依赖于其前的最近的一个 I 帧 或者 P 帧 及其后的最近的一个 P 帧 进行解码 , B 帧 不能 依赖与 B 帧 ; 前后画面帧 与 本帧 共 3 帧的 数据叠加 取得最终的画面 ; B 帧 压缩率高 , B 帧 的 压缩 与 解码 对计算机的性能要求较高 ; 2、B 帧解码案例 B 帧解码时 , 需要参考 前后 两帧 GOP 参数 , 以达到最佳的 压缩效果 和 图像质量 ; 2、各类型帧解码错误影响 B 帧 不是参考帧 , 解码错误 不会扩散到其它帧 , 只会影响自己所在的一个帧 ; I 帧 一旦解码错误 , 会影响到整个 如 : H.264 ) , 编码顺序 和 显示顺序 可能并不一致 , 特别是当存在B帧时 ; 此时 DTS 和 PTS 就显得尤为重要 , 这两个时间戳 能够确保音视频数据的正确同步和顺序播放 ; 2、
开发(dev)访问:http://localhost:9000/weChat/home/omdex
Frame Animation,也叫 Drawable Animation,原理就类似视频快速播放一帧一帧的图片。 其中一个 <item> 代表一帧。 <?xml version="1.0" encoding="utf-8"? drawable="@color/color1" android:duration="200" /> <item android:drawable="@color/color<em>2</em>" > <resources> <color name="color1">#FF3030</color> <color name="color<em>2</em>">#FF4500</color> < 帧动画
2 数据帧与遥控帧 在CAN协议中,数据帧和遥控帧有着诸多相同之处,所以,在这里,我们将数据帧和遥控帧放在一起来讲。 比如:在某一个时刻,节点Node_A向总线发送了一个ID号为ID_2的遥控帧,那么就意味着Node_A请求总线上的其他节点发送ID号为ID_2的数据帧。 节点Node_B能够发出ID号为ID_2的数据帧,那么Node_B就会在收到Node_A发出的遥控帧之后,立刻向总线上发送ID号为ID_2的数据帧。 比如:在某一时刻t,节点Node_A发出了ID号为ID_2遥控帧报文来请求总线上的其它节点发出ID号为ID_2的数据帧报文。但是就在同一时刻t,节点Node_B发出了ID号为ID_2的数据帧报文。 比如:Node_A发送了一帧ID号为ID_1的报文Msg_1,Node_B的验收滤波ID表中恰好有ID_1,于是乎Msg_1就会被Node_B接收。
今天给大家带来的是 2B 领域的一个架构难题,我们最终也没有找到一个较好「解决」方案, 或者说它本来就是一个伪命题。 让我慢慢跟你道来… 软件的划分模式 首先从软件系统的划分模式讲起。 多业态 在 2B 领域,让我们更棘手的是,还要面临多业态问题。 什么是多业态? 如果说分层是 1D、 垂直划分是 2D、再加上多业态,就是 3D 了! 这些行业多态会横向击穿垂直拆分后的模块壁垒,行业的多样性会渗透到程序的各个角落,开闭原则形同虚设。 很多非 SasS 化的 2B 公司的应该都是这类模式。 对我们来说更大的挑战在于:下游的项目能尽量复用上游的功能,避免重复工作,并且要求上游的更新能向下传递,甚至不排除下游合并到上游的可能性。 另外这些变化,也反映了我们对 2B 行业探索和认知上面的变化: 初创团队就是一个单体团队(左图所示),接着开始多行业撒网,原本的项目上慢慢堆砌出各种行业的形态(右图所示)。
C2C 是Consumer to Consumer 是个人对个人的,运用了物流,比如淘宝的淘小铺 B2C 是Business to Consumer 是商家对个人,运用了物流,这个就很多了当当京东等等都是 B2B 是Business to Business 是企业间的,比如1688 O2O 是 Online to Offline 是在线上消费,不需要物流,在线下享受服务,主要强调的是线上向线下的转化 C2M
要求:去除数据库中重复的xid数据,并且只保留一条最大的id的数据 解决: User::find()->select(“id”)->groupBy([‘xid’])->where([‘<>’,’xid’
只是把它的原理弄明白一些了,但是,我弱小的意志在DirectX SDK那个1000多行的SkinedMesh例子面前顺利地崩溃了,心想,还是先从最基本的关键帧动画开始做吧-_-! MD2是基于关键帧动画的,关键帧插值的数学公式为: p(t) = p(0) + t ( p1 - p0 ) 其中: t — 当前时间。 MD2共有16个关键帧: start:0 end:39 name:stand start:40 end:45 name:run start:46 end:53 name:attack start:54 ,每帧由很多三角形组成一个网络,每个三角形由三个顶点组成,每个顶点由x,y,z三个坐标组成,每个……(再说就欠揍了) 那么怎么让它动呢? 就是一帧帧地画就行了!
而正是这个优化出现了一点问题,现象如下: 已经判断播放点 A 和 Seek 点 B 不在一个 GOP 内,然后执行 av_seek_frame 方法还是把时间点 A 所在 GOP 全部解码了,导致播放上出现了卡顿 这里就很奇怪了,明明判断不在一个 GOP ,那 Seek 时就应该从时间点 B 所在 GOP 的 I 帧开始解码, 但执行时还是解码了上一个 GOP 的内容。 在没有 B 帧的情况下,I 帧的 PTS 等于 DTS ,所以判断不会出问题。 然而正是有了 B 帧,如果 I 帧的 PTS 和 DTS 不相等的话,那么上面的判断相当于是拿一个 PTS 值和 I 帧的 DTS 比较是否同一个 GOP 了。 帧,DTS 值为 0 ,有 B 帧,那么首帧的 DTS 值就可以用来做偏差值进行计算了。