Skip to content

How to put elementary video stream into container?

Roman Arzumanyan edited this page Dec 7, 2021 · 2 revisions

Nvenc produces elementary video stream which can be either opened with video player like VLC or it can be put into containers like *.avi, *.mkv and such.

Process of putting elementary video stream into container is called muxing.
VPF doesn't support muxing but it can be done with other Python libraries, e. g. with PyAV.

Thanks to @wykvictor for the snippet below:

# 1. init
dstFile = av.open(dstFilePath, 'w')
out_stream = dstFile.add_stream('h264', rate = 25)
out_stream.width = w
out_stream.height = h

# 2. mux
encByteArray = bytearray(encFrame)  # encFrame from EncodeSingleSurface
pkt = av.packet.Packet(encByteArray)
pkt.pts = pts_time
pkt.dts = pts_time
pkt.stream = out_stream  # attach pkt to the stream
dstFile.mux(pkt)