最近在修改一些问题,涉及到了网页播放视频的相关东西,分析了一下流程,把它记录下来,不然可能一个星期就忘掉了.
在chromium网页切换小屏至全屏的过程中,每一个视频url对应一个WebMediaPlayer(有唯一id), 从而对应一个Browser进程中的MediaPlayerBridge. HTMLMediaElement的src变化时都会调用到HTMLMediaElement::startPlayerLoad(),进而去创建一个新的WebMediaPlayer, 然后去load. 如果该Video已经处于全屏状态,则调用ChromeClient::enterFullScreenForElement保证新创建的WebMediaPlayer也进入全屏.
全屏时, 用的java MediaPlayer公用小屏时的MediaPlayer, 只是更换了MediaPlayer的Surface. 小屏时MediaPlayer的Surface为SurfaceTexure, 全屏是为ContentVideoView中的SurfaceView
播放完毕WebMediaPlayer会被release, 进而MediaPlayerBridge也会被release. 同时如果此时是全屏播放, 那么全屏id(fullscreen_player_id_, 保存在BrowserMediaPlayerManager中)会随着MediaPlayerBridge的消失而变成无效(赋值为kInvalidMediaPlayerId, BrowserMediaPlayerManager会使用fullscreen_player_id_来查找相应的MediaPlayerBridge,如果fullscreen_player_id_无效就说明此时没有全屏的播放器)
每次进入全屏时会将新的MediaPlayer的id设置为全屏的id, 这部分逻辑在BrowserMediaPlayerManager::OnEnterFullscreen(int player_id)中处理
简单说就是: 每个src对应一个WebMediaPlayer,也就对应一个MediaPlayerBridge. src变化后前一个的MediaP
在chromium网页切换小屏至全屏的过程中,每一个视频url对应一个WebMediaPlayer(有唯一id), 从而对应一个Browser进程中的MediaPlayerBridge. HTMLMediaElement的src变化时都会调用到HTMLMediaElement::startPlayerLoad(),进而去创建一个新的WebMediaPlayer, 然后去load. 如果该Video已经处于全屏状态,则调用ChromeClient::enterFullScreenForElement保证新创建的WebMediaPlayer也进入全屏.
全屏时, 用的java MediaPlayer公用小屏时的MediaPlayer, 只是更换了MediaPlayer的Surface. 小屏时MediaPlayer的Surface为SurfaceTexure, 全屏是为ContentVideoView中的SurfaceView
播放完毕WebMediaPlayer会被release, 进而MediaPlayerBridge也会被release. 同时如果此时是全屏播放, 那么全屏id(fullscreen_player_id_, 保存在BrowserMediaPlayerManager中)会随着MediaPlayerBridge的消失而变成无效(赋值为kInvalidMediaPlayerId, BrowserMediaPlayerManager会使用fullscreen_player_id_来查找相应的MediaPlayerBridge,如果fullscreen_player_id_无效就说明此时没有全屏的播放器)
每次进入全屏时会将新的MediaPlayer的id设置为全屏的id, 这部分逻辑在BrowserMediaPlayerManager::OnEnterFullscreen(int player_id)中处理
简单说就是: 每个src对应一个WebMediaPlayer,也就对应一个MediaPlayerBridge. src变化后前一个的MediaP