码率、帧率,what mean?

本文介绍了码率和帧率的基本概念及它们在视频处理中的作用。码率是指单位时间内的数据传输量,影响视频质量和文件大小。帧率是指每秒传输的图片数量,决定动画的流畅度。

以前没有接触视频这一块,对视频这一方面的知识不是很了解。现在了解一下码率和帧率的问题。       

码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来的cbr(固定码率)与vbr(可变码率),都是在这方面做的文章,不过事情总不是绝对的,从音频方面来说,码率越高,被压缩的比例越小,音质损失越小,与音源的音质越接近。

“码率”就是失真度,码率越高越清晰,反之则画面粗糙而多马赛克。计算机中的信息都是二进制的0和1来表示,其中每一个0或1被称作一个位,用小写b表示,即bit(位);大写B表示byte,即字节,一个字节=八个位,即1B=8b;前面的大写K表示千的意思,即千个位(Kb)或千个字节(KB)。表示文件的大小单位,一般都使用字节(KB)来表示文件的大小。    

Kbps:首先要了解的是,ps指的是/s,即每秒。Kbps指的是网络速度,也就是每秒钟传送多少个千位的信息(K表示千位,Kb表示的是多少千个位),为了在直观上显得网络的传输速度较快,一般公司都使用kb(千位)来表示,如果是KBps,则表示每秒传送多少千字节。1KBps=8Kbps。ADSL上网时的网速是512Kbps,如果转换成字节,就是512/8=64KBps(即64千字节每秒)。      

帧数简单地说,帧数就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。一般来说30fps是可以接受的,所以要避免动作不流畅的最低fps是30。除了30fps外,有些计算机视频格式,例如AVI,每秒只能提供15帧。我们之所以能够利用摄像头来看到连续不断的影像,是因为影像传感器不断摄取画面并传输到屏幕上来,当传输速度达到一定的水平时,人眼就无法辨别画面之间的时间间隙,所以大家可以看到连续动态的画面。        

每秒的帧数(fps)或者说帧率表示图形处理器场景时每秒钟能够更新几次。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为显示器不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了。       

一般用“FPS(frame per second,每秒钟画面更新的数量)”来表示该项指标。在欣赏电视、电影画面时,只要画面的刷新率达到24帧/秒,就能满足人们的需要。同样的,在玩普通的游戏时,如果刷新率达到24帧/秒即可,但在一些高速游戏中(例如射击游戏),如果画面的刷新率还是只有24帧/秒,那么就会感觉到画面比较迟钝,不够流畅。

  虽然理论上画面的刷新率越快越好,但过高的刷新率并没有实际意义——当画面的FPS达到60帧/秒时,已经能满足绝大部分应用需求。一般情况下,如果能够保证游戏画面的平均FPS能够达到30帧/秒,那么画面已经基本流畅;能够达到50帧/秒,就基本可以体会到行云流水的感觉了。一般人很难分辨出60帧/秒与100帧/秒有什么不同。

  (2)是什么影响了FPS

  既然刷新率越快越好,为什么还要强调没必要追求太高的刷新率呢?其中原因是在显示分辨率不变的情况下,FPS越高,则对显卡的处理能力要求越高。

  电脑中所显示的画面,都是由显卡来进行输出的,因此屏幕上每个像素的填充都得由显卡来进行计算、输出。当画面的分辨率是1024×768时,画面的刷新率要达到24帧/秒,那么显卡在一秒钟内需要处理的像素量就达到了“1024×768×24=18874368”。如果要求画面的刷新率达到50帧/秒,则数据量一下子提升到了“1024×768×50=39321600”。

  FPS与分辨率、显卡处理能力的关系如下:处理能力=分辨率×刷新率。这也就是为什么在玩游戏时,分辨率设置得越大,画面就越不流畅的原因了。

在 WebRTC 中实现远程视频流的分辨率和帧率动态调整,主要依赖于 `RTCPeerConnection` 的 `getSenders()` 和 `getReceivers()` 方法,以及通过修改 `RTCRtpSender` 或 `RTCRtpReceiver` 的参数来控制媒体流的传输行为。以下是从不同角度实现分辨率和帧率动态调整的详细方法: ### 3.1 通过 `RTCRtpSender.setParameters()` 调整发送端参数 在发送端(本地)可以通过获取 `RTCRtpSender` 对象并调用其 `setParameters()` 方法来动态修改视频的分辨率和帧率。这种方式适用于本地采集并发送视频流的场景。 ```javascript const videoTrack = localStream.getVideoTracks()[0]; const sender = peerConnection.getSenders().find(s => s.track === videoTrack); const parameters = sender.getParameters(); // 设置编码参数,限制最大分辨率和帧率 parameters.encodings = [{ maxBitrate: 500000, // 500 kbps scaleResolutionDownBy: 2, // 分辨率缩小比例 maxFramerate: 15 // 最大帧率 }]; sender.setParameters(parameters) .then(() => console.log('分辨率和帧率调整成功')) .catch(error => console.error('调整失败:', error)); ``` 此方法可以用于根据网络状况动态调整视频流的编码参数,从而实现自适应码率控制[^2]。 ### 3.2 通过 `RTCRtpReceiver.setParameters()` 调整接收端参数 在接收端(远程)可以通过 `RTCRtpReceiver` 来控制接收的视频流质量。虽然接收端不能直接控制远端发送的分辨率和帧率,但可以请求发送端调整,通常通过信令机制协商。 ```javascript const receiver = peerConnection.getReceivers().find(r => r.track.kind === 'video'); const parameters = receiver.getParameters(); // 设置接收端期望的编码参数 parameters.encodings = [{ scaleResolutionDownBy: 1.5, maxFramerate: 20 }]; receiver.setParameters(parameters) .then(() => console.log('接收端参数调整成功')) .catch(error => console.error('接收端调整失败:', error)); ``` 此方法适用于在接收端进行视频渲染优化,例如降低分辨率以适应小屏幕设备[^2]。 ### 3.3 使用 `MediaStreamTrack.applyConstraints()` 限制采集参数 在采集阶段,可以通过 `MediaStreamTrack.applyConstraints()` 方法限制视频轨道的分辨率和帧率,从而从源头控制视频流的质量。 ```javascript const videoTrack = localStream.getVideoTracks()[0]; videoTrack.applyConstraints({ width: { max: 640 }, height: { max: 480 }, frameRate: { max: 30 } }) .then(() => console.log('采集参数限制成功')) .catch(error => console.error('采集参数限制失败:', error)); ``` 此方法适用于在采集阶段就对视频流进行限制,减少编码和传输压力[^1]。 ### 3.4 通过 SDP 操作控制媒体协商 在创建 Offer 或 Answer 时,可以通过操作 SDP 来指定视频编码参数,从而在协商阶段就确定视频流的分辨率和帧率。 ```javascript const offer = await peerConnection.createOffer({ offerToReceiveVideo: true }); // 修改 SDP 中的分辨率和帧率参数 offer.sdp = offer.sdp.replace('a=framerate:30', 'a=framerate:15'); offer.sdp = offer.sdp.replace('a=width:1280', 'a=width:640'); offer.sdp = offer.sdp.replace('a=height:720', 'a=height:480'); await peerConnection.setLocalDescription(offer); ``` 此方法适用于在协商阶段就对视频流参数进行硬性限制,确保两端使用统一的编码参数[^2]。 ### 3.5 结合网络状况自动调整 可以结合 `RTCPeerConnection.getStats()` 获取的网络统计信息(如码率、丢包率、延迟等)来动态调整视频流参数。 ```javascript async function monitorNetworkAndAdjust() { const stats = await peerConnection.getStats(); stats.forEach(report => { if (report.type === 'inbound-rtp' && report.kind === 'video') { const currentBitrate = report.bitrateReceived; const currentFramerate = report.framesPerSecond; if (currentBitrate < 500000) { // 网络带宽不足,降低分辨率 adjustResolution(640, 480); } if (currentFramerate < 20) { // 帧率下降,降低帧率限制 adjustFramerate(15); } } }); } setInterval(monitorNetworkAndAdjust, 5000); ``` 此方法适用于构建自适应码率控制(ABR)机制,根据网络状况实时调整视频质量,以保证流畅体验。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值