我有一个 Python 程序,它通过网络接收一系列 H264 视频帧,我想要显示这些视频帧,也可以选择录制这些帧。摄像机以 30FPS 的速度进行录制并尽可能快地发送帧,由于网络条件的变化,该帧率不会始终保持在 30FPS;有时它会落后然后赶上,很少会完全丢帧。
“显示”部分很简单;我不需要关心时间或流元数据,只需在帧到达时尽快显示它们:
input = av.open(get_video_stream())
for packet in input.demux(video=0):
for frame in packet.decode():
# A bunch of numpy and pygame code here to convert the frame to RGB
# row-major and blit it to the screen
Run Code Online (Sandbox Code Playgroud)
“记录”部分看起来应该很简单:
input = av.open(get_video_stream())
output = av.open(filename, 'w')
output.add_stream(template=input.streams[0])
for packet in input.demux(video=0):
for frame in packet.decode():
# ...display code...
packet.stream = output.streams[0]
output.mux_one(packet)
output.close()
Run Code Online (Sandbox Code Playgroud)
事实上,这会生成一个包含所有帧的有效 MP4 文件,如果我用它回放mplayer -fps 30它,效果很好。但这-fps 30是绝对必要的: …