01 / 范围与读法
本文关注普通媒体元素播放的职责边界。src、MSE、平台 Renderer、远程媒体和受保护媒体可能选用不同分支。源码地图是调查入口,不是所有平台通用的唯一调用栈。
02 / 从 HTMLMediaElement 到管线控制
HTMLMediaElement 的创建逻辑通过 frame client 调用 CreateWebMediaPlayer。现代 blink::WebMediaPlayerImpl 的 StartPipeline 调用 pipeline_controller_->Start。PipelineController 暴露启动、seek、挂起和恢复接口;它管理生命周期,不是压缩数据流中的解码节点。
阅读入口:HTMLMediaElement(创建约 L1765) → WebMediaPlayerImpl(Start 约 L3070) → PipelineController。
已核对首尾调用点。frame client 到具体工厂的完整中间栈、实际线程及平台选择,仍待在固定构建跟踪。
03 / Demuxer、Decoder 与 Renderer
DemuxerStream 提供压缩数据,DecoderStream 异步读取并衔接解码结果。VideoRendererImpl 初始化 VideoDecoderStream,在 FrameReady 接收帧,在 Render 选择呈现帧。RendererImpl 协调音视频 renderer;这不是同步函数链。
阅读入口:DecoderStream · RendererImpl · VideoRendererImpl。
常见 src 可由 FFmpegDemuxer 解封装,MSE 由 ChunkDemuxer 接收追加数据。解码器选择受 RendererFactory、构建与平台影响;没有证明目标机器使用哪种硬解,也没有性能测试。这里描述的是 Chromium 的能力,独立 FLV → MP4 转换仍由本仓库 C++ 实现。
04 / 从 VideoFrame 到提交
VideoFrameCompositor 实现 media::VideoRendererSink,并持有 RenderCallback 接口,连接媒体时序与合成侧请求。在 Surface 提交路径中,VideoFrameSubmitter 调用 SubmitCompositorFrame,后续由 Viz 与平台显示路径处理。
阅读入口:VideoFrameCompositor(继承约 L66) · VideoFrameSubmitter(提交约 L853 / L881)。
解码输出、合成提交和物理显示是不同证据。requestVideoFrameCallback 是网页侧视频帧观察点,不能单独证明 平台 overlay 或物理屏幕扫描输出。未核实所有呈现分支。
05 / 电视平台映射与待验证问题
- 固定构建选中了哪种 Renderer / Decoder?是否跨 Mojo 或 GPU 进程?
- load / play / seek 的线程、取消机制与回调生命周期如何关联帧提交?
- 旧版 chromium-efl / Tizen 的分支、类和文件能否公开核对?mmplayer 与 buffer / surface 生命周期在哪里交接?
- 目标平台 使用纹理合成还是 overlay?从解码到显示的证据如何闭环?
以上均为待验证。电视原生播放器经验提供研究方向,不将历史厂商实现冒充现代 Chromium 主线,不填造内部调用关系。
06 / 可复现的下一步
固定 revision 与构建配置,记录媒体哈希,分别运行 src 与 MSE,采集 media-internals 与媒体 / 合成 trace。关联读取、解码、帧选择和提交时刻,记录运行时观察,取得证据后再讨论根因与变更。
07 / 来源与核对记录
以下链接固定到本文快照。media/README.md 可能仍有旧路径或命名空间,应以相应 revision 的类定义为准。
- third_party/blink/renderer/core/html/media/html_media_element.cc
- third_party/blink/renderer/platform/media/web_media_player_impl.cc
- media/filters/pipeline_controller.h
- media/renderers/video_renderer_impl.cc
- third_party/blink/renderer/platform/media/video_frame_compositor.h
- third_party/blink/renderer/platform/graphics/video_frame_submitter.cc
- media/renderers/renderer_impl.cc
- media/filters/decoder_stream.cc