Android 4.0 (API 레벨 15)에는 코덱 목록을 가져올 API가 없습니다. New API은 API 레벨 16 이상 만 지원합니다. 하지만 API 레벨 15를 지원해야합니다. 따라서 JNI를 사용하여 here을 참조하는 원시 코드를 작성해야합니다. 이름이 단지 형식 char *
이기 때문에Android NDK에서 코덱 정보의 역할을 어떻게 얻을 수 있습니까?
void *handle = dlopen("libstagefrighthw.so", RTLD_NOW);
if (handle == NULL) {
return -1;
}
typedef OMXPluginBase *(*CreateOMXPluginFunc)();
CreateOMXPluginFunc createOMXPlugin =
(CreateOMXPluginFunc)dlsym(handle, "createOMXPlugin");
if (!createOMXPlugin) {
createOMXPlugin = (CreateOMXPluginFunc)dlsym(
handle, "_ZN7android15createOMXPluginEv");
}
OMXPluginBase *plugin = (*createOMXPlugin)();
if (plugin) {
OMX_U32 index = -1;
char name[128];
OMX_ERRORTYPE err;
while ((err = plugin->enumerateComponents(name, sizeof(name),
++index)) == OMX_ErrorNone) {
printf("%s\n", name);
}
if (err != OMX_ErrorNoMore) {
printf("0x%x\n", err);
}
}
내가 코덱 정보의 이름을 얻을 수 있습니다 :
struct OMXPluginBase {
OMXPluginBase() {}
virtual ~OMXPluginBase() {}
virtual void dummy1() = 0;
virtual void dummy2() = 0;
virtual OMX_ERRORTYPE enumerateComponents(
OMX_STRING name,
size_t size,
OMX_U32 index) = 0;
virtual OMX_ERRORTYPE getRolesOfComponent(
const char *name,
Vector<String8> *roles) = 0;
private:
OMXPluginBase(const OMXPluginBase &);
OMXPluginBase &operator=(const OMXPluginBase &);
};
코드
코덱 정보의 이름을 얻을 수 있습니다. 그러나 이제는OMX_ERRORTYPE getRolesOfComponent(const char *name, Vector<String8> *roles)
기능을 사용하여 코덱 정보의 역할을 얻으려고합니다.
roles
이
Vector<String8>
유형이고이 두 클래스가 없기 때문에 나는 할 수 없습니다. 더 진지하게, 안드로이드는
libutils.so
과 같은 공유 라이브러리에서이 두 클래스의 구현을 제공하지 않는 것 같습니다. 어떻게이 기능을 호출하고 내가 원하는 정보를 얻을 수 있습니까? 도와주세요. 나는 하루 종일 두통이있다! @ 알렉스에
업데이트
덕분에, 마침내 나는 내 문제를 해결했다. 나는 코드 here을 넣었다. 희망이 같은 문제를 만난 사람들을 도울 것입니다.
나는 dlopen()을 통해 비공개 네이티브 API와 함께 작업하는 우리의 접근 방식을 좋아합니다. 그러나 모든 실제적인 목적을 위해 libstagefright.so와 다른 것들에 직접 링크 할 수 있으며,'android :: Vector'와'android :: String8'을위한 시스템 헤더도'# include '할 수 있습니다. –