我希望你是响亮而自豪的。
我是PyAV的新手,我正在使用aiortc for WebRTC MediaServer,在aiortc现场会话中,每个视频帧都有av.VideoFrame对象可用,我想实时地从这些帧创建HLS视频片段。
正如您在这个项目中所看到的
他们使用OpenCV视频帧字节(通过管道传输到FFmpeg CLI )进行HLS流。
我的问题是,如何使用PyAV/python来消费av.VideoFrame对象,并提取由60帧组成的2秒视频片段用于HLS流?
或任何适合组装VideoFrames到HLS流的python包。
提前感谢
发布于 2022-07-03 11:41:15
你在混合一些术语。我假设HLS指的是HTTP流。WebRTC是发送视频(P2P)的另一种方式(协议)。aiortc不是MediaServer,即使您可以做类似的事情。您可以使用aiortc作为向浏览器(另一个WebRTC客户端)发送视频跟踪的WebRTC客户端。可以使用HTTP服务器作为信令服务器来建立连接。
下面我假设您喜欢使用aiortc (WebRTC)来传输您的视频。
如何转换轨道的帧(例如从网络摄像头)?
如果我正确理解你,你的实际问题是“如何转换轨道的帧(例如从网络摄像头)?”这里是一个可运行的示例,它使用MediaStreamTrack实现VideoTransformTrack。但是,此示例从浏览器(其他客户端)接收摄像头图像。看看这示例,它使用服务器的网络摄像头(Python )。只需加上
pc.addTrack(VideoTransformTrack(video, transform="rotate"))到RTCPeerConnection (上面的片段中的pc),video从create_local_tracks返回。
如何从框架中创建轨道?
class MyMediaStreamTrack(MediaStreamTrack):
def __init__(self) -> None:
super().__init__()
# use webcam as source of frames in this example
self.frames = av.open(file="/dev/video0").decode()
self.kind = 'video'
async def recv(self):
# read next av.VideoFrame
frame = next(self.frames)
# optional: transform/consume frame
frame = self._transform(frame)
return frame
def _transform(self, frame):
img = frame.to_ndarray(format="bgr24")
rows, cols, _ = img.shape
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), frame.time * 45, 1)
img = cv2.warpAffine(img, M, (cols, rows))
# rebuild a VideoFrame, preserving timing information
new_frame = av.VideoFrame.from_ndarray(img, format="bgr24")
new_frame.pts = frame.pts
new_frame.time_base = frame.time_base
return new_frame
pc = RTCPeerConnection()
pc.addTrack(MyMediaStreamTrack())https://stackoverflow.com/questions/65868671
复制相似问题