移植个解码器而已,没必要还非得自己写个播放器吧
参考libstatefright/codecs目录里的代码,封装实现start、stop、read三个接口就可以了
参考libstatefright/codecs目录里的代码,封装实现start、stop、read三个接口就可以了
程序的流程是
播放器打开文件,得到输入流 ,输入流传递给解码器, 解码器解码, 解码器输出流, 输出流来到java端,java端调用SurfaceView绘图.
播放器打开文件,得到输入流 ,输入流传递给解码器, 解码器解码, 解码器输出流, 输出流来到java端,java端调用SurfaceView绘图.
所以从Awesomeplayer开始看就行,首先是分离器的实现,对于系统本身不支持的格式是没有分离器的,
具体查看代码(我只以本地文件播放举例,不说网络流播放),
Awesomeplayer.cpp的setDataSource_l(
这个就是创建分离器的地方,查看代码MediaExtractor.cpp的create函数
datasource的sniff函数就是自动检测媒体格式容器的类型的,楼主要新增原系统无法识别的媒体格式,必然无法得到有效的分离器,所以这里需要自己创建自己分离器,我就暂时没有自己写相应的sniff函数,每一种格式的XXXXExtractor.cpp函数中有个SniffXXXX函数,在Awesomeplayer的构造函数中的这一句DataSource::RegisterDefaultSniffers()就是注册好所有的sniff函数,额,这个你想标准化点就这么干吧,写一个自己的XXXExtractor类,照样写个XXXXsinff函数,在RegisterDefaultSniffers中加入自己的函数,
解码阶段了,
status_t AwesomePlayer::initVideoDecoder() {
mVideoSource = OMXCodec::Create(
mClient.interface(), mVideoTrack->getFormat(),
false,
mVideoTrack);
status_t AwesomePlayer::initVideoDecoder() {
这个就是创建的解码器了,create的最后一个参数就是分离出来的独立的视频流,具备的接口最重要的就是read接口,是分离器中实现的,这个track是XXXXExtractor中的getTrack获取的
对应的视频流格式就对应你自己解码器
解码器的逻辑主要集中在OMXCodec.cpp中,sp<MediaSource> softwareCodec =
InstantiateSoftwareCodec (componentName, source);
这个函数就是查找解码器的,你肯定要在kDecoderInfo数组里面加入自己解码器名称,在kFactoryInfo注册自己解码器创建函数