Android MediaSource

一、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代码分析如下:

Android13 HTTPLiveSource代码分析-CSDN博客

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值