httpflv获取时间戳
时间: 2025-03-01 18:47:03 浏览: 40
### 使用HTTP-FLV协议获取时间戳
当使用HTTP-FLV协议进行视频流传输时,可以通过解析FLV标签来提取时间戳信息。每个FLV数据包都包含一个前缀部分,其中包含了时间戳字段。
对于HTTP-FLV请求,在接收到的数据帧中,每一段媒体数据(音频或视频)都会被打包成FLV Tag格式发送给客户端。这些Tag头部结构如下:
| 字段名 | 类型 | 描述 |
|------------|-------|----------------------------------------------------------|
| PreviousSize | uint32 | 上一个tag的大小 |
| Filter | uint8 | 是否启用过滤器 |
| Type | uint8 | 数据类型 (0x08表示音频, 0x09表示视频) |
| Data Size | uint24 | 当前tag的有效载荷长度 |
| Timestamp | uint24 | 时间戳低三位 |
| TimestampExtended | uint8 | 时间戳高八位 |
因此,要获得当前播放位置的时间戳,可以读取每个到达的FLV tag头中的Timestamp字段并将其转换为毫秒单位[^1]。
下面是一个简单的Python脚本用于接收HTTP-FLV流并将打印出各个片段对应的时间戳:
```python
import socket
from struct import unpack
def read_tag_header(data):
previous_size = unpack('>I', data[:4])[0]
filter_flag = ord(data[4:5])
type_ = ord(data[5:6])
size = unpack(">I", b'\0' + data[6:9])[0]
ts_low = unpack(">I", b'\0' + data[9:12])[0]
ts_high = ord(data[12:13])
timestamp = ((ts_high << 24) | ts_low)
return {
'previous_size': previous_size,
'filter': filter_flag != 0,
'type': type_,
'size': size,
'timestamp': timestamp
}
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8080)
sock.connect(server_address)
request = "GET /live/stream.flv HTTP/1.1\r\nHost: localhost:8080\r\nConnection: keep-alive\r\n\r\n"
sock.sendall(request.encode())
buffer = bytearray()
while True:
chunk = sock.recv(1024 * 1024)
if not chunk:
break
buffer.extend(chunk)
while len(buffer) >= 13 and len(buffer) >= 11 + unpack(">I", b'\0' + bytes([buffer[6], buffer[7], buffer[8]]))[0]:
header_info = read_tag_header(bytes(buffer))
print(f"Received packet with timestamp={header_info['timestamp']}ms")
consumed_bytes = 11 + header_info["size"]
del buffer[:consumed_bytes]
sock.close()
```
此代码连接到本地运行的服务端口,并模拟了一个HTTP GET请求去拉取名为`stream.flv`的直播流资源。每当成功解析一个新的FLV标签时就会输出该标签携带的时间戳值[^2]。
阅读全文
相关推荐


















