You can parse it with scapy. First import necessary module and define your packets:
from scapy.contrib.http2 import *
pkt0 = b"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
pkt1 = b"\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00"
pkt2 = b"\x00\x00\x04\x08\x00\x00\x00\x00\x00\x00\xff\x00\x01"
Then you can confirm that the first packet is a preface, parse the other packets and display them:
assert pkt0 == H2_CLIENT_CONNECTION_PREFACE
frame1 = H2Frame(pkt1)
frame2 = H2Frame(pkt2)
frame1.show()
'''
###[ HTTP/2 Frame ]###
len = 0x6
type = SetFrm
flags = set()
reserved = 0
stream_id = 0
###[ HTTP/2 Settings Frame ]###
\settings \
|###[ HTTP/2 Setting ]###
| id = Initial window size
| value = 16777216
'''
frame2.show()
'''
###[ HTTP/2 Frame ]###
len = 0x4
type = WinFrm
flags = set()
reserved = 0
stream_id = 0
###[ HTTP/2 Window Update Frame ]###
reserved = 0
win_size_incr= 16711681
'''
Or you can parse them together:
frame_sequence = H2Seq(pkt1 + pkt2)
frame_sequence.show()
'''
###[ HTTP/2 Frame Sequence ]###
\frames \
|###[ HTTP/2 Frame ]###
| len = 0x6
...
'''
frame_sequence.frames is a list of H2Frame frames. To access the payload, use the payload property. For example: frame1.payload.settings[0].value, frame2.payload.win_size_incr.