0
点赞
收藏
分享

微信扫一扫

Python实现视频编码压缩和解码 【SocetIO】


客户端:

import av
import socketio
import msgpack
import cv2
import numpy as np

sio = socketio.Client()


DEFAULT_CODEC_NAME = "h264"
DEFAULT_CODEC_CONFIG = {"bit_rate": 2 * 1024 * 1024,
"width": 640,
"height": 480,
"framerate": 30,
"pix_fmt": "yuv420p",
}

def get_codec(codec_name=None, codec_conf=None, codec_options=None):
cname = DEFAULT_CODEC_NAME
cconf = DEFAULT_CODEC_CONFIG
coptions = codec_options or {}
codec = av.CodecContext.create(cname, "w")
msgs = [f"\n+++++++++ {cname} configure: " + "{"]
for k, v in cconf.items():
setattr(codec, k, v)
msgs.append(f"{k}={v}")
msgs.append("}")
codec.options["forced-idr"] = "1"
# may be replaced with user-specified opts
codec.options.update(coptions)
msgs.append("$$$$$$$$$ codec options: {")
for k, v in coptions.items():
msgs.append(f"{k}={v}")
msgs.append("}")
return codec


def get_decode_codec(codec_name=None, codec_conf=None, codec_options=None):
cname = codec_name or DEFAULT_CODEC_NAME
cconf = codec_conf or DEFAULT_CODEC_CONFIG
coptions = codec_options or {}
codec = av.CodecContext.create(cname, "r")
msgs = [f"\n+++++++++ {cname} configure: " + "{"]
for k, v in cconf.items():
setattr(codec, k, v)
msgs.append(f"{k}={v}")
msgs.append("}")
codec.options["forced-idr"] = "1"
# may be replaced with user-specified opts
codec.options.update(coptions)
msgs.append("$$$$$$$$$ codec options: {")
for k, v in coptions.items():
msgs.append(f"{k}={v}")
msgs.append("}")
return codec


@sio.event
def connect():
pass

def start_info():
print('Connection established')
codec = get_codec()
out_codec = get_decode_codec()
container = av.open('test.mp4')
video_stream = container.streams.video[0]

for packet in container.demux(video_stream):
for frame in packet.decode():
codec.width = frame.width
codec.height = frame.height
h264_video_list = codec.encode(frame)
for h264_video in h264_video_list:
compressed_video = msgpack.packb(h264_video.to_bytes())
sio.emit('video_frame', compressed_video)

sio.disconnect()

@sio.event
def disconnect():
print('Disconnected from server')

sio.connect('http://localhost:5000')

start_info()

服务端代码:

import av
import socketio
import msgpack
import numpy as np
import cv2
import eventlet

sio = socketio.Server()

DEFAULT_CODEC_NAME = "h264"
DEFAULT_CODEC_CONFIG = {"bit_rate": 2 * 1024 * 1024,
"width": 640,
"height": 480,
"framerate": 30,
"pix_fmt": "yuv420p",
}

def get_decode_codec(codec_name=None, codec_conf=None, codec_options=None):
cname = codec_name or DEFAULT_CODEC_NAME
cconf = codec_conf or DEFAULT_CODEC_CONFIG
coptions = codec_options or {}
codec = av.CodecContext.create(cname, "r")
msgs = [f"\n+++++++++ {cname} configure: " + "{"]
for k, v in cconf.items():
setattr(codec, k, v)
msgs.append(f"{k}={v}")
msgs.append("}")
codec.options["forced-idr"] = "1"
# may be replaced with user-specified opts
codec.options.update(coptions)
msgs.append("$$$$$$$$$ codec options: {")
for k, v in coptions.items():
msgs.append(f"{k}={v}")
msgs.append("}")
return codec


out_codec = get_decode_codec()

@sio.on('connect')
def connect(sid, environ):
print('Connection established')

@sio.on('video_frame')
def receive_video_frame(sid, compressed_video):
print('执行解压操作....')
uncompressed_data = msgpack.unpackb(compressed_video)
packet_ = av.Packet(uncompressed_data)
for frame_vi in out_codec.decode(packet_):
vi_img = frame_vi.to_ndarray(format='bgr24')
cv2.imshow('vi',vi_img)
cv2.waitKey(1)

@sio.on('disconnect')
def disconnect(sid):
print('Disconnected from client')

if __name__ == '__main__':
app = socketio.WSGIApp(sio)
eventlet.wsgi.server(eventlet.listen(('localhost', 5000)), app)


举报

相关推荐

0 条评论