[Video and Audio Data Processing] 视频的基础参数、分辨率,帧率和码率

1. 图像与像素

视频是由连续的图像构成的。

每一张图像,我们称为一帧(frame)。图像则是由像素(pixel)构成的。一张图像有多少像素,称为这个图像的分辨率。比如说1920x1080的图像,说明它是由横纵1920x1080个像素点构成。视频的分辨率就是每一帧图像的分辨率。

2.帧率

一个视频,每一秒由多少图像构成,称为这个视频的帧率(frame-rate)。常见的帧率有24000/1001=23.976, 30000/1001=29.970, 60000/1001=59.940, 25.000, 50.000等等。这个数字是一秒钟内闪过的图像的数量。比如23.976,就是1001秒内,有24000张图像。视频的帧率是可以是恒定的(cfr, Const Frame-Rate),也可以是变化的(vfr, Variable Frame-Rate)。

3. 码率

码率的定义是视频文件体积除以时间。单位一般是Kbps(Kbit/s)或者Mbps(Mbit/s)。注意1B(Byte)=8b(bit)。所以一个24分钟,900MB的视频:
体积:900MB = 900MByte = 7200Mbit
时间:24min = 1440s
码率:7200/1440 = 5Mbps = 5000 Kbps

转载链接:https://vcb-s.nmm-hd.org/Twilight%20Council/%5BVCB-Studio%5D%5B%E6%95%99%E7%A8%8B00%5D%E8%A7%86%E9%A2%91%E6%A0%BC%E5%BC%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%5BVCB-Studio%5D%5B%E6%95%99%E7%A8%8B00%5D%E8%A7%86%E9%A2%91%E6%A0%BC%E5%BC%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.pdf

在 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)机制,根据网络状况实时调整视频质量,以保证流畅体验。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值