接下来探讨Media播放器的架构设计
1 从数据流的角度来看
File -> UFS API -> | |
Network -> UDP Packet -> | Media Demux | -> Decoder -> Audio/Video Render Devic
Network -> HTTP -> | |
Network -> RTP -> | |
可见, 我们要考虑构建3个系统
系统1: Demux
功能定位: 从source端读取数据,并缓存,进行协议解析(Demux),
生成Decoder系统需要的Payload Packet队列
系统2: Decoer
对数据进行逆向解码,生成Render端格式需要的数据。
系统3: 硬件系统
各种视频,音频输出设备,最常见的声卡,显卡。
系统1 ~3在嵌入式系统通常是芯片公司负责硬件开发,并提供API,
开发者做的事情是设置参数和考虑各种回调函数,异步事件处理,共享内存的分配。
接下来主要考虑系统1和2由软件处理的情况下,如何设计系统。
2 Task设计
考虑到交互性
设计如下Task:
Task 1: UI 主Task,负责与用户交互,并将用户请求转发到MediaCtl
Task 2: MediaCtrl, 负责控制Demux线程和Decoder线程,并处理底层SDL来的硬件Event
Task 3: Demux 线程,负责按协议解析输入数据
Task 4: 解码线程,负责解码数据。
Task 5: 系统监听线程,负责接收SDL来的各种事件,并转发到上面线程。
3 接口设计
按照数据流,依次设计如下接口
ByteReader -》 FileReader/ HttpReader / UDPReader/ RtpReader
CachedBuffer
MediaDemux -> AsfDemux / WavDemux / Mp3Demux
RingBuffer
PacketQueue
StreamInfo
MediaDecoder -> AudioDecoder / VideoDecoer
AudioSample
AudioRender -> AudioRenderOSS / AudioRenderSDL / AudioRenderALSA
VideoFrame
VideoRender -> VideoRenderSDL / VideoRenderDirectFB
MediaCtrl -> AsfCtrl / Mp3Ctrl /Mp4Ctrl
1 从数据流的角度来看
File -> UFS API -> | |
Network -> UDP Packet -> | Media Demux | -> Decoder -> Audio/Video Render Devic
Network -> HTTP -> | |
Network -> RTP -> | |
可见, 我们要考虑构建3个系统
系统1: Demux
功能定位: 从source端读取数据,并缓存,进行协议解析(Demux),
生成Decoder系统需要的Payload Packet队列
系统2: Decoer
对数据进行逆向解码,生成Render端格式需要的数据。
系统3: 硬件系统
各种视频,音频输出设备,最常见的声卡,显卡。
系统1 ~3在嵌入式系统通常是芯片公司负责硬件开发,并提供API,
开发者做的事情是设置参数和考虑各种回调函数,异步事件处理,共享内存的分配。
接下来主要考虑系统1和2由软件处理的情况下,如何设计系统。
2 Task设计
考虑到交互性
设计如下Task:
Task 1: UI 主Task,负责与用户交互,并将用户请求转发到MediaCtl
Task 2: MediaCtrl, 负责控制Demux线程和Decoder线程,并处理底层SDL来的硬件Event
Task 3: Demux 线程,负责按协议解析输入数据
Task 4: 解码线程,负责解码数据。
Task 5: 系统监听线程,负责接收SDL来的各种事件,并转发到上面线程。
3 接口设计
按照数据流,依次设计如下接口
ByteReader -》 FileReader/ HttpReader / UDPReader/ RtpReader
CachedBuffer
MediaDemux -> AsfDemux / WavDemux / Mp3Demux
RingBuffer
PacketQueue
StreamInfo
MediaDecoder -> AudioDecoder / VideoDecoer
AudioSample
AudioRender -> AudioRenderOSS / AudioRenderSDL / AudioRenderALSA
VideoFrame
VideoRender -> VideoRenderSDL / VideoRenderDirectFB
MediaCtrl -> AsfCtrl / Mp3Ctrl /Mp4Ctrl