一、MediaSource介绍
Source 在播放器中起着拉流(Streaming)和解复用(demux)的作用,Source 设计的好坏直接影响到播放器的基础功能,
NuPlayer::Source 是一个抽象类,定义了 Source 实现所需要的基本接口,例如 prepareAsync,start,dequeueAccessUnit等,除此之外还包含了一些共有的方法,例如 Callback发送 等。
android 为我们提供了5种 Source 实现,分别为:
-
HTTPLiveSource:url 为 m3u8 结尾的 http 链接时,NuPlayer 将创建 HTTPLiveSource;
-
RTSPSource:url 为 rtsp 开头,或者以sdp结尾时,将创建 RTSPSource;
-
RTPSource:
-
GenericSource:通用 Source,当 url 不符合以上创建条件时会创建该 Source,一般用于本地播放;
-
StreamingSource:NuPlayer 的 setDataSource 提供了一个以 IStreamSource 为参数的版本,意为由上层自己实现 Source,参数 IStreamSource 将被封装在 StreamingSource 中供 NuPlayer 使用。如果我们想在 native 自定义 Source,可以实现 IStreamSource 接口,然后调用这个版本的 setDataSource 方法。
NuPlayer::Source 提供有如下基本播放控制接口,具体实现可根据需求覆写这些实现:
void prepareAsync
void start()
void stop()
void pause()
void resume()
void disconnect()
status_t feedMoreTSData()
status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit)
status_t seekTo(int64_t /* seekTimeUs */,MediaPlayerSeekMode /* mode */ = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC)
NuPlayer::Source 提供有名为 Flags 的枚举类型,Flags 标记了当前播放码流所支持的操作,执行完 prepareAsync 后会将 Flags 信息上抛,最终打开或关闭上层的一些功能:
enum Flags {
FLAG_CAN_PAUSE = 1,
FLAG_CAN_SEEK_BACKWARD = 2, // the "10 sec back button"
FLAG_CAN_SEEK_FORWARD = 4, // the "10 sec forward button"
FLAG_CAN_SEEK = 8, // the "seek bar"
FLAG_DYNAMIC_DURATION = 16,
FLAG_SECURE = 32, // Secure codec is required.
FLAG_PROTECTED = 64, // The screen needs to be protected (screenshot is disabled).
};
Source 运行过程中可能会有如下事件上抛给 NuPlayer,上抛所调用的函数实现在 NuPlayer.cpp 中:
-
kWhatPrepared:Source prepare 完成通知 NuPlayer;
-
kWhatFlagsChanged:prepare 过程中获取的码流支持的操作,prepare 过程中上抛给 NuPlayer;
-
kWhatVideoSizeChanged:prepare 过程中获取的码流宽高等信息,prepare 过程中上抛给 NuPlayer;
-
kWhatBufferingUpdate:上抛当前 buffering 的百分比;
-
kWhatPauseOnBufferingStart:上抛 buffering 开始事件;
-
kWhatResumeOnBufferingEnd:上抛 buffering 结束事件;
-
kWhatCacheStats:上抛当前的缓存带宽信息;
-
kWhatInstantiateSecureDecoders:上抛信息创建 secure decoder;
二、MediaSource相关类
NuPlayer::Source
NuPlayer::Source代码位于:
frameworks/av/media/libmediaplayerservice/nuplayer/include/nuplayer/NuPlayerSource.h
NuPlayer::Source的定义:
struct NuPlayer::Source : public AHandler {}
NuPlayer::GenericSource
NuPlayer::GenericSource继承于NuPlayer::Source,负责通常Soruce的相关处理。
NuPlayer::GenericSource代码位于:
frameworks/av/media/libmediaplayerservice/nuplayer/GenericSource.cpp
frameworks/av/media/libmediaplayerservice/nuplayer/include/nuplayer/GenericSource.h
NuPlayer::GenericSource的定义:
struct NuPlayer::GenericSource : public NuPlayer::Source, public MediaBufferObserver {}
NuPlayer::StreamingSource
NuPlayer::StreamingSource继承于NuPlayer::Source,负责Streaming Soruce的相关处理。
NuPlayer::StreamingSource代码位于:
frameworks/av/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
frameworks/av/media/libmediaplayerservice/nuplayer/include/nuplayer/StreamingSource.h
NuPlayer::StreamingSource的定义:
struct NuPlayer::StreamingSource : public NuPlayer::Source {}
NuPlayer::HTTPLiveSource
NuPlayer::HTTPLiveSource继承于NuPlayer::Source,负责HTTPLive Soruce的相关处理。
NuPlayer::HTTPLiveSource代码位于:
frameworks/av/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
frameworks/av/media/libmediaplayerservice/nuplayer/include/nuplayer/HTTPLiveSource.h
NuPlayer::HTTPLiveSource的定义:
struct NuPlayer::HTTPLiveSource : public NuPlayer::Source {}
NuPlayer::RTSPSource
NuPlayer::RTSPSource继承于NuPlayer::Source,负责RTSP Soruce的相关处理。
NuPlayer::RTSPSource代码位于:
frameworks/av/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
frameworks/av/media/libmediaplayerservice/nuplayer/include/nuplayer/RTSPSource.h
NuPlayer::RTSPSource的定义:
struct NuPlayer::RTSPSource : public NuPlayer::Source {}
NuPlayer::RTPSource
NuPlayer::RTPSource继承于NuPlayer::Source,负责RTP Source的相关处理。
NuPlayer::RTPSource代码位于:
frameworks/av/media/libmediaplayerservice/nuplayer/RTPSource.cpp
frameworks/av/media/libmediaplayerservice/nuplayer/include/nuplayer/RTPSource.h
NuPlayer::RTPSource的定义:
struct NuPlayer::RTPSource : public NuPlayer::Source {}
IMediaSource
IMediaSource代码位于:
frameworks/av/media/libmedia/IMediaSource.cpp
frameworks/av/media/libmedia/include/media/IMediaSource.h
IMediaSource的定义:
class IMediaSource : public IInterface {}
class RemoteMediaBufferWrapper : public MediaBuffer {}
class BnMediaSource: public BnInterface<IMediaSource> {}
class BpMediaSource : public BpInterface<IMediaSource> {}
IDataSource
IDataSource 代码位于:
frameworks/av/media/libmedia/IDataSource.cpp
frameworks/av/media/libmedia/include/android/IDataSource.h
IDataSource 的定义:
class IDataSource : public IInterface {}
class BnDataSource : public BnInterface<IDataSource> {}
struct BpDataSource : public BpInterface<IDataSource> {}
MediaSource
MediaSource 代码位于:
frameworks/av/media/libstagefright/MediaSource.cpp
frameworks/av/media/libstagefright/include/media/stagefright/MediaSource.h
MediaSource的定义:
struct MediaSource : public virtual RefBase {}
AnotherPacketSource
AnotherPacketSource代码位于:
frameworks/av/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
frameworks/av/media/libstagefright/mpeg2ts/include/mpeg2ts/AnotherPacketSource.h
AnotherPacketSource的定义:
struct MediaSource : public virtual RefBase {}
RemoteMediaSource
RemoteMediaSource代码位于:
frameworks/av/media/libstagefright/RemoteMediaSource.cpp
frameworks/av/media/libstagefright/include/media/stagefright/RemoteMediaSource.h
RemoteMediaSource的定义:
class RemoteMediaSource : public BnMediaSource {}
DataSource
DataSource代码位于:
frameworks/av/include/media/DataSource.h
frameworks/av/media/libstagefright/include/media/stagefright/DataSourceBase.h
DataSource的定义:
class DataSource : public DataSourceBase, public virtual RefBase {}
class DataSourceBase {}
DataURISource
DataURISource代码位于:
frameworks/av/media/libdatasource/DataURISource.cpp
frameworks/av/media/libdatasource/include/datasource/DataURISource.h
DataURISource的定义:
struct DataURISource : public DataSource {}
DataSourceFactory
DataSourceFactory代码位于:
frameworks/av/media/libdatasource/DataSourceFactory.h
frameworks/av/media/libdatasource/include/datasource/DataSourceFactory.h
DataSourceFactory 的定义:
class DataSourceFactory : public RefBase {}
PlayerServiceDataSourceFactory
PlayerServiceDataSourceFactory代码位于:
frameworks/av/media/libmediaplayerservice/datasource/PlayerServiceDataSourceFactory.cpp
frameworks/av/media/libmediaplayerservice/datasource/include/datasource/PlayerServiceDataSourceFactory.h
PlayerServiceDataSourceFactory的定义:
class PlayerServiceDataSourceFactory : public DataSourceFactory {}
httplive相关
LiveSession
LiveSession代码位于:
frameworks/av/media/libstagefright/httplive/LiveSession.cpp
frameworks/av/media/libstagefright/httplive/LiveSession.h
LiveSession的定义:
struct LiveSession : public AHandler {}
HTTPDownloader
LiveSession代码位于:
frameworks/av/media/libstagefright/httplive/HTTPDownloader.cpp
frameworks/av/media/libstagefright/httplive/HTTPDownloader.h
LiveSession的定义:
struct HTTPDownloader : public RefBase {}
LiveDataSource
LiveDataSource代码位于:
frameworks/av/media/libstagefright/httplive/LiveDataSource.cpp
frameworks/av/media/libstagefright/httplive/LiveDataSource.h
LiveDataSource的定义:
struct LiveDataSource : public DataSource {}
M3UParser
M3UParser代码位于:
frameworks/av/media/libstagefright/httplive/M3UParser.cpp
frameworks/av/media/libstagefright/httplive/M3UParser.h
M3UParser的定义:
struct M3UParser : public RefBase {}
PlaylistFetcher
PlaylistFetcher代码位于:
frameworks/av/media/libstagefright/httplive/PlaylistFetcher.cpp
frameworks/av/media/libstagefright/httplive/PlaylistFetcher.h
PlaylistFetcher的定义:
struct PlaylistFetcher : public AHandler {}
三、MediaSource代码分析
GenericSource
GenericSource 名为通用 source,但是往往它会被用来当作本地播放的 Source,由于本地播放的码流文件会有形形色色的封装格式,所以这个 source 会依赖解封装(demux)服务 media.extractor。除了依赖解封装外,source 还需要一个 IO 来读取码流,这个 IO 被封装在 DataSource中。Source、DataSource、Extractor三者的关系如下:
GenericSource代码分析如下:
Android GenericSource代码分析-CSDN博客
HTTPLiveSource
HTTPLiveSource主要用户解析HLS协议,主要由HTTPLiveSource、LiveSession、HTTPDownloader、M3UParser、PlaylistFetcher组成,如下为HTTPLiveSource的结构图:
HTTPLiveSource代码分析如下: