由一个问题引起的read the source code。
在使用android的mediaplayer点播m3u8时,有这样一个问题,播放一会 按home之后再回来播放时,视频是从头开始播放而无法从上次的位置播放。
在应用层是调用getcurrnetpositon 来保持位置,再次播放调用seekTo。
读NUPlayer的实现,重点关注NUPlayer中seekTo的实现,下面是seekTo的调用
1 LiveSession.cpp :: seekTo(...)
---> new AMessage(kWhatSeek)
--->onMessageReceived(...)
------->kWhatSeek->onSeek
2 LiveSession.cpp::onSeek(...)
--->fetchPlayList(...)
---->changeConfiguration(...)
3LiveSession.cpp::changeConfiguration()
-->changeConfiguration2(...)
4LiveSession.cpp::changeConfiguration2(...)
-->changeConfiguration3(..)
5 LiveSession.cpp::changeConfiguration3(...)
--->fetcher->startAsync(..)
6 PlayListFetcher::startAsync(...)
--->send kWhatStart msg
7 PlayListFetcher::onStart(...)
---->postMonitorQueue(...)
8 PlayListFetcher::postMonitorQueue()
-->send message ... onMonitorQueue(...)
9 PlayListFetcher:: onMonitorQueue(...)
--->onDownloadNext(...)
省略细节到这里有两个关键的部分mSession->fetchPlaylist和mSession->fetchfile,
fetchPlaylist是解析M3u文件,取到playlist(个人称它是ts文件集)及每个ts的信息等完成后会返回一个M3Uparser的指针,fetchfile是获取uri中的ts文件
其中参数range-offset和range-length 是根据之前 M3Uparser::parses解析m3u文件的#EXT-X-BYTERANGE这个tag获得时间去确定的。