在使用sdk-c viewer端进行拉流的过程中,viewer端拉取的是视频帧和音频帧,不会在播放器中播放,所以要根据收到的流来判断拉流过程是否稳定流畅。
我这边采用的算法是:依据相邻帧之间的时间间隔是否落在期望值的 ±20% 范围内。
音频帧、视频帧的日志打印如下:
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
假设期望帧间隔是 20ms,那接收的帧间隔必须在lower和upper之间:
之后遍历相邻的时间戳,计算差值即时间间隔:
这里有一点需要注意,如果时间间隔大于最大值很好理解,肯定是卡顿了,那么小于最小值为什么也被认定为不稳定呢,时间差越短不是越流畅吗?这里解释一下:
比如视频帧率是 25fps,对应每帧间隔约 40ms。如果某几帧突然变成 20ms,就不是“按帧率稳定输出”的表现。帧率不稳,会导致:
流媒体播放是“节奏感”不是“越快越好”
一个稳定的视频流(比如 25fps)应该每 40ms 一帧。如果突然来一帧只间隔了 10ms,会导致播放器不知道该怎么同步音视频,甚至可能触发跳帧。过快或过慢,都是对稳定性的破坏。
时间间隔短,可能是网络包聚合延迟之后一次性发送多帧的情况。
举个例子:
假设有个节拍器本来每 1 秒“哒”一下,现在突然 0.1 秒“哒哒哒”3 次,那么它可能出故障了!
# 判断帧时间是否稳定(±20%)
is_stable() {
local expected_ms=$1
shift
local -a times=("$@")
local lower=$((expected_ms * 8 / 10))
local upper=$((expected_ms * 12 / 10))
for ((i = 1; i < ${#times[@]}; i++)); do
local diff=$((times[i] - times[i-1]))
if (( diff < lower || diff > upper )); then
return 1
fi
done
return 0
}
第一个参数 $1:是期望的帧间隔(单位是毫秒),比如:
后续参数:是一系列时间戳(以毫秒为单位),代表每帧的接收时间。这些时间戳是在分析viewer端日志的过程中,获取到的n帧视频帧时间戳和n帧音频帧时间戳。
前一篇:https://blog.csdn.net/zhang_jiamin/article/details/149053832?spm=1011.2415.3001.5331