码率无法直接获取,因HTML5 Video API不提供video.bitrate属性,需用file.size÷duration人工计算后,再用Stream统计分布。

不能直接用 Stream API 统计视频码率分布——因为码率(bitrate)不是视频文件自带的元数据字段,HTML5 Video API 本身不提供 video.bitrate 属性。必须先提取原始数据(如时长、文件大小),再人工计算,之后才能用 Stream 进行分布统计。
为什么码率无法直接获取
浏览器原生 video 元素仅暴露以下基础元数据:
- duration:总时长(秒)
- videoWidth / videoHeight:分辨率
- readyState、networkState 等状态值
码率需通过 文件体积 ÷ 时长 推算(单位:bps),且前提是已知原始文件字节大小(File.size)。这一步必须在前端完成,无法靠后端或 Stream API 自动补全。
前端预处理:从 File 提取「可计算码率」的数据对
对每个视频文件,需构造含 fileSize 和 duration 的对象:
const extractVideoInfo = (file) => {
return new Promise((resolve, reject) => {
const video = document.createElement('video');
video.preload = 'metadata';
video.src = URL.createObjectURL(file);
<pre class="brush:php;toolbar:false;">video.onloadedmetadata = () => {
const duration = video.duration;
// 注意:duration 可能为 Infinity(流式/无头文件),需校验
if (!isFinite(duration) || duration reject(new Error('元数据加载失败'));}); };
Java Stream 实现码率分布分组统计
假设你已批量获取 N 个视频的 {name, size, duration} 列表(例如通过后端接口返回 JSON 数组),可用 Stream 按码率区间归类:
- 先计算每条记录的码率:
(size * 8.0 / duration)(转为 bps) - 定义区间边界,如 [0, 1Mbps), [1Mbps, 3Mbps), [3Mbps, +∞)
- 用
Collectors.groupingBy+ 匿名函数做桶划分
List<videometa> metas = ... // 已加载的元数据列表
<p>Map<string long> bitrateDistribution = metas.stream()
.filter(m -> m.duration > 0)
.mapToDouble(m -> m.size * 8.0 / m.duration) // bps
.mapToObj(bitrate -> {
if (bitrate </string></p></videometa>
输出示例:{"低码率(
进阶:支持自定义分桶与百分位数统计
若需更精细分析(如 P50/P90 码率值),可结合 Collectors.collectingAndThen 与排序:
- 先收集所有码率值到 List
- 排序后按索引取对应分位点(如 size×0.5 → 中位数)
double[] bitrates = metas.stream() .filter(m -> m.duration > 0) .mapToDouble(m -> m.size * 8.0 / m.duration) .sorted() .toArray(); <p>int len = bitrates.length; double p50 = len > 0 ? bitrates[len / 2] : 0; double p90 = len > 0 ? bitrates[(int) (len * 0.9)] : 0;</p>
整个流程依赖前端准确提取 size+duration,Stream 只负责后续聚合。跳过预处理,Stream 就无数据可算。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











