首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从PyAV av.VideoFrame创建HLS视频流

从PyAV av.VideoFrame创建HLS视频流
EN

Stack Overflow用户
提问于 2021-01-24 08:57:02
回答 1查看 507关注 0票数 1

我希望你是响亮而自豪的。

我是PyAV的新手,我正在使用aiortc for WebRTC MediaServer,在aiortc现场会话中,每个视频帧都有av.VideoFrame对象可用,我想实时地从这些帧创建HLS视频片段。

正如您在这个项目中所看到的

他们使用OpenCV视频帧字节(通过管道传输到FFmpeg CLI )进行HLS流。

我的问题是,如何使用PyAV/python来消费av.VideoFrame对象,并提取由60帧组成的2秒视频片段用于HLS流?

或任何适合组装VideoFrames到HLS流的python包。

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2022-07-03 11:41:15

你在混合一些术语。我假设HLS指的是HTTP流。WebRTC是发送视频(P2P)的另一种方式(协议)。aiortc不是MediaServer,即使您可以做类似的事情。您可以使用aiortc作为向浏览器(另一个WebRTC客户端)发送视频跟踪的WebRTC客户端。可以使用HTTP服务器作为信令服务器来建立连接。

下面我假设您喜欢使用aiortc (WebRTC)来传输您的视频。

如何转换轨道的帧(例如从网络摄像头)?

如果我正确理解你,你的实际问题是“如何转换轨道的帧(例如从网络摄像头)?”这里是一个可运行的示例,它使用MediaStreamTrack实现VideoTransformTrack。但是,此示例从浏览器(其他客户端)接收摄像头图像。看看示例,它使用服务器的网络摄像头(Python )。只需加上

代码语言:javascript
运行
复制
pc.addTrack(VideoTransformTrack(video, transform="rotate"))

RTCPeerConnection (上面的片段中的pc),videocreate_local_tracks返回。

如何从框架中创建轨道?

代码语言:javascript
运行
复制
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())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65868671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档