我希望你是响亮而自豪的。
我是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
复制相似问题