<项目日志 1004> 轻量便携流媒体播放器框架设计-2
来源:互联网 发布:怎样在淘宝上卖二手货 编辑:程序博客网 时间:2024/04/30 11:30
前面讨论最基础的设计思路,下面说明详细的设计实现。
- Access 模块
class Access {public: virtual ~TeaAccess(){}; //interfaces virtual bool Open() = 0; virtual void Close() = 0; //callbacks sigslot::signal1<bool> signalBeginOfStream; sigslot::signal0<> signalEndOfStream; sigslot::signal2<const unsigned char*, size_t> signalData;};
Access为独立线程,因此signalData回调需要进行数据复制之后进行线程切换。
- Demux 模块
class Demux{public: virtual ~TeaDemux(){}; //interfaces virtual bool Open() = 0; virtual void Close() = 0; virtual bool PushNewData(const unsigned char *data, size_t length) = 0; //callbacks sigslot::signal1<bool> signalProbed; sigslot::signal1<MediaPacket *> signalMediaPacket; std::map<unsigned int, Decoder *> decoders;};
主要Open/Close如文字定义,负责Demuxer资源初始化和释放,其中PushNewData完成数据接收(即接收Access的数据)。
回调主要有两个,signalProbed(bool)回调主要完成是否正确解析多媒体文件,signalMediaPacket即解析出来的媒体包。
Demux为一独立线程,根据Access的数据不断产生MediaPacket数据,送给Decode模块解码。
此外,Demux在正确解析多媒体文件之后,维护Decoder对象,Decoder对象将MediaPacket解码为YUV和PCM数据。
- DecodeTask 模块
该模块是整个播放器的核心之一,设计如下:
class DecodeTask {public: DecodeTask(Demux *dm); virtual ~DecodeTask(){}; //interfaces void PushMediaPacket(MediaPacket *pkt); void DecodeVideo(MediaTime target); void DecodeAudio(MediaTime target); MediaTime BufferedVideoLength(); unsigned int BufferedPictures(); MediaTime FirstPictureTime(); MediaTime LastPictureTime(); MediaTime BufferedAudioLength(); MediaTime FirstAudioTime(); MediaTime LastAudioTime(); //callbacks sigslot::signal1<VideoPicture *> signalVideoPicture; sigslot::signal1<AudioPCM *> signalVideoPCM;};
DecodeTask 模块独立线程,但是通过DecodeVideo/DecodeAudio驱动,生成的结果通过两个回调函数返回,并且提供内部音视频数据缓冲状况。Player对象通过定期查询DecodeTask的缓冲状况,驱动解码起进行解码,并将解码结果送交AudioOut模块以及VideoOut模块。
- <项目日志 1004> 轻量便携流媒体播放器框架设计-2
- <项目日志 1003> 轻量便携流媒体播放器框架设计-1
- <项目日志 1005> 轻量便携流媒体播放器框架设计-3
- StructureMap 轻量IOC框架
- 轻量框架,重量框架到底是什么意思?
- android 流媒体 播放器 项目 源码
- DataRabbit 轻量的ORM框架
- android轻量框架二__Activity生命周期
- android轻量框架__JAVA 线程
- android轻量框架_各种Dialog
- android 网络应用轻量框架
- Java语言cron4j轻量调度框架
- Java_J2EE_轻量_J2EE应用框架;
- Android轻量缓存框架--ASimpleCache
- Android轻量缓存框架--ASimpleCache
- Android轻量缓存框架--ASimpleCache
- Android轻量缓存框架--ASimpleCache
- Python轻量Web框架Flask使用
- 自动生成用户名或密码
- Oracle中日期Date类型格式的转化
- 循环获取Map集合数据
- 2009操作系统
- 排序------------------分治策略与组合法
- <项目日志 1004> 轻量便携流媒体播放器框架设计-2
- 在 Linux 下用户空间与内核空间数据交换的方式之二
- java 之 线程池学习
- 如何调试跟踪Android源代码
- Java ClassLoader
- struts的ActionRedirect类
- linux c inline
- 深入探讨用位掩码代替分支(2):汇编代码分析
- typedef定义函数类型分析