libdash分析
libdash是bitmovin公司开源的一个DASH库,完整实现了DASH协议,可以在Github上获取其代码。同时,该开源库还基于QT开发了一个播放器,之前做DASH自适应算法的时候,在该实例播放器上实现过算法,也对该播放器的代码结构较为熟悉,特记录下来,本文将主要针对设计自适应算法部分的代码。
整体结构
每一个类的作用
1. DASHPlayer
class DASHPlayer : public IDASHPlayerGuiObserver, public managers::IMultimediaManagerObserver
这个sample player用的最多的一种设计模式就是观察者模式,可以看到几乎下面每一个类都是继承了几个观察者类,通过观察者这种形式,来获取其包含的类的状态信息,包括下载状态、buffer状态以及播放器按钮等。DASHPlayer继承了IDASHPlayerGuiObserver和IMultimediaManagerObserver,其将观察DASHPlayerGui和MultimediaManager两个类的状态,分别对应着下面两组函数。同时,DASHPlayer主要的两个包含的类就是QtSamplePlayerGui和MultimediaManager,前者负责QT界面的功能,后者负责媒体的下载和播放。
virtual void OnSettingsChanged (int period, int videoAdaptationSet, int videoRepresentation, int audioAdaptationSet, int audioRepresentation);
virtual void OnStartButtonPressed (int period, int videoAdaptationSet, int videoRepresentation, int audioAdaptationSet, int audioRepresentation);
virtual void OnStopButtonPressed ();
virtual void OnDownloadMPDPressed (const std::string &url);
当QT界面的DownloadMPD按钮按下的话,将执行该函数里的内容,其余的类似,分别是Start, Stop, Setting所对应的功能。下面简单介绍一下,OnDownloadMPDPressed函数的功能,
void DASHPlayer::OnDownloadMPDPressed (const std::string &url)
{
if(!this->multimediaManager->Init(url))
{
this->gui->SetStatusBar("Error parsing mpd at: " + url);
return; // TODO dialog or symbol that indicates that error
}
this->SetSettings(-1, -1, -1, -1, -1);
this-&