AWS WebRTC:根据viewer端拉流日志推算视频帧率和音频帧率
viewer端拉流日志是这样的:
07:19:26.263 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.283 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.298 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 4458, Flags 3210729368
2025-06-12 07:19:26.303 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.323 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.338 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 263, Flags 3210729368
2025-06-12 07:19:26.343 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.363 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.378 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 314, Flags 3210729368
2025-06-12 07:19:26.383 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.403 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.418 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 825, Flags 3210729368
2025-06-12 07:19:26.423 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.443 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.458 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 1066, Flags 3210729368
2025-06-12 07:19:26.463 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.484 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.498 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 1029, Flags 3210729368
2025-06-12
如何从这样的拉流日志中推算出视频帧率和音频帧率呢?
首先要获取足够的样本
比如获取300条视频帧日志:
grep -i 'Video Frame received' viewer_channel_index_20250612_071920_039.log | head -n 300
- 先用 grep 过滤出所有匹配行
- 再用 head -n 300 只显示前300条结果
之后在上面命令得到的结果基础上,过滤出每行日志前面的日期和时间,例如,2025-06-12 07:19:42.138
grep -i 'Video Frame received' viewer_channel_index_20250612_071920_039.log | head -n 300 | awk '{print $1, $2}'
- awk ‘{print $1, $2}’ 打印每行的第1和第2列,也就是日期和时间(空格分隔)
得到的结果是:
2025-06-12 07:19:38.738
2025-06-12 07:19:38.778
...
2025-06-12 07:19:50.698
计算步骤
第一帧时间:07:19:38.738
最后一帧时间:07:19:50.698
先把时间转换成秒:
07:19:38.738 → 73600 + 1960 + 38.738 = 26378.738秒
07:19:50.698 → 73600 + 1960 + 50.698 = 26390.698秒
时间差 = 26390.698 - 26378.738 = 11.96秒
我取了 300 条时间戳,所以,帧数 = 300
帧率 = 帧数 / 时间差 = 300 / 11.96 ≈ 25.08 fps
据此推算视频流的平均帧率大约是 25 fps。
如果视频帧率是 25 fps(frames per second),那么每一帧之间的理论时间间隔为:
1 秒 / 25 帧 = 0.04 秒 = 40 毫秒
帧率为 25fps → 理想帧间隔是 40ms
允许波动 ±20%:
40ms * 0.8 = 32ms(下限)
40ms * 1.2 = 48ms(上限)
所以,
lower=32
upper=48
是一个 合理、宽容但不松散 的时间间隔判断范围,可以用来判断是否稳定达到了 25fps。
音频帧的日志取样为:
07:19:38.699
07:19:38.719
07:19:38.740
07:19:38.760
07:19:38.780
07:19:38.800
...
音频帧之间的间隔大多为 20ms 左右,所以:
1 秒 / 0.02 秒(20ms) = 50 帧每秒
音频帧率 ≈ 50 fps
允许波动 ±20%:
20ms * 0.8 = 16ms(下限)
20ms * 1.2 = 24ms(上限)
所以,
lower=16
upper=24