最近项目上经常遇到播放器相关的问题。所以没有办法,只能看一下Android 播放器相关的框架。通过最近的学习,个人感觉有一下几点心得。
主要有一下几点需要注意:
1.视频文件中的视频格式(video/avc)是如何确定的(mp4文件中的mime)
2.解码插件是在OMXMaster文件中进行加载的。所以第三方插件接入口就在这个地方
3.如何根据videoTrack加载插件列表中的解码库
4.OMX与解码库之间的交互是通过mHandler进行的,而mHandler的初始化是在解码器加载的时候有解码器初始化的。
Android 中Media的框架
NuPlayer初始化
底层NuPlayer消息传递
解码器继承关系及Component初始化
如何根据视频格式加载解码库
OMX_ERRORTYPE SoftOMXPlugin::makeComponentInstance(
const char *name,
const OMX_CALLBACKTYPE *callbacks,
OMX_PTR appData,
OMX_COMPONENTTYPE **component) {
//根据name查找对应的Component
for (size_t i = 0; i < kNumComponents; ++i) {
if (strcmp(name, kComponents[i].mName)) {
continue;
}
//查找到Component之后合成解码器库的名字
AString libName = "libstagefright_soft_";
libName.append(kComponents[i].mLibNameSuffix);
libName.append(".so");
//加载解码库
void *libHandle = dlopen(libName.c_str(), RTLD_NOW);
if (libHandle == NULL) {
ALOGE("unable to dlopen %s,%s", libName.c_str(),dlerror());
return OMX_ErrorComponentNotFound;
}
typedef SoftOMXComponent *(*CreateSoftOMXComponentFunc)(
const char *, const OMX_CALLBACKTYPE *,
OMX_PTR, OMX_COMPONENTTYPE **);
//for example, SoftMPEG4.cpp, createSoftOMXComponent
CreateSoftOMXComponentFunc createSoftOMXComponent =
(CreateSoftOMXComponentFunc)dlsym(
libHandle,
"_Z22createSoftOMXComponentPKcPK16OMX_CALLBACKTYPE"
"PvPP17OMX_COMPONENTTYPE");
if (createSoftOMXComponent == NULL) {
dlclose(libHandle);
libHandle = NULL;
return OMX_ErrorComponentNotFound;
}
//加载解码库的入口函数,这里面要注意component参数。后面和解码库交互使用的就是这个参数,即mHandler
sp<SoftOMXComponent> codec =
(*createSoftOMXComponent)(name, callbacks, appData, component);
···
return OMX_ErrorInvalidComponentName;
}