서적에 관한 질문 및 오류 등을 문의 할 수 있으며, 저자로부터 직접 답변을 받을 수 있습니다.
안녕하세요~
프레임워크 소스를 분석하다가 궁금한 점이 있어서 또 질문드려봅니다.
저번 질문에 연장된 질문이기도 하네요;;
안드로이드 소스에 보면 MediaPlayerService.cpp 소스가
안드로이드의 미디어 서버에 있는 미디어 플레이어 서비스의 기능을 구현한 소스인거 같은데요...
main_mediaserver.cpp 소스를 보니...
미디어 서버를 프로세스로 실행해서..
각 서비스의 인스턴스를 생성하고 컨텍스트 매니저에 서비스 이름을 등록한 뒤
바인더를 이용해서 서비스를 사용하는것 같던데... 제가 이해한 것인데 맞는지 모르겠네요..
문제가 생긴게.. MediaPlayerService.cpp 소스 내부에서
getPlayerTyep 함수로 미디어 재생 엔진을 결정더군요...
그래서 확장 된 엔진이나 새로운 엔진을 추가하기 위해서는 MediaPlayerService.cpp 소스 수정이 불가피하고
수정 된 MediaPlayerService를 새로운 미디어서버 프로세스를 실행해 컨텍스트 매니저에 등록 해야 할 것 같은데...
새로운 미디어서버 프로세스를 생성 한 뒤 MediaPlayerService 인스턴스를 생성해야 될까요??
아니면 실행되고 있는 미디어 서버에 새로운 서비스를 추가할 수 있는 방법이 있나요?
방향을 제대로 잡고 있는지도 잘 모르겠군요 ㅠㅠ....
아.. 갈길이 멀군요~
답변 감사드립니다~!
저의 상황을 정리를 해보자면 ㅎㅎ
소프트웨어 디코딩과 하드웨어 디코딩을 동시에 지원하는 플레이어를 만들어 보고 있구요..
기존의 유명 플레이어들의 공통 특징이기도 하죠
저도 소프트웨어 디코딩 쪽으로는 ffmpeg 라이브러리와 Opengl es Shader를 써서 작업중에 있습니다.
다만 하드웨어 디코딩을 통한 프레임 데이터 추출을 원하는 이유가 속도적인 측면에서
아직까지는 벤더에서 제공하는 디코더가 성능이 좋은 것을 아실겁니다.
Java API 인 MediaPlayer로 쉽게 벤더에서 제공하는 하드웨어 디코딩을 사용할 수 있지만 프레임 데이터를 직접 컨트롤 할 수는 없기 때문에 다른 방법을 찾아봐야 했습니다.
API 14부터 제공되는 MediaCodec을 써서 하드웨어 디코딩을 구현해보았지만..
Java쪽으로 올라와있는 buffer를 통해서 프레임데이터에 접근할려고 해도 역시나 제한이 걸려있어서 접근이 안되더군요..
그래서 다른 방법으로
PDK소스를 때어와서 Awesomeplayer 까지의 호출 루틴을 재작성(미친짓인듯 ㅠ)하고 확장한 뒤
So파일로 만들어서 앱에서 호출하는 방식으로 구현해 보고 있었습니다..
그런데 지식이 짧아 미처 알지 못한 부분이 있었는데요.ㅠㅠ..
제가 재작성한 MediaPlayerService를 등록하기 위해서는
MediaServer 프로세스에 등록해야하는데... 이 MediaServer 프로세스가 부팅시에 init프로세스에서 생성이되고
프로세스를 동적으로는 생성이 안된다더군요 ㅠ... 즉 루팅을 하지 않는 이상 불가하다는 것을 알게 됐습니다.ㅜㅜ
정리를 하자면 하드웨어 디코딩 된 프레임 데이터를 루팅하지 않고 가져와서 여러가지 추가된 기능을 넣고 싶었는데... 더이상 방법이 보이질 않네요 ㅎ;; 루팅이 답인가요 ;;;;
하드웨어 디코딩 된 프레임 데이터를 직접 사용만 할 수 있다면 성능 좋은 확장된 기능의 플레이어를 만들 수 있겠다는 생각에서 출발했는데 다른 아이디어가 있는지 조언을 구하고 싶네요...^^
동적으로는 불가능합니다.
안드로이드의 안 좋은 점 중의 하나입니다만, 원래 system level에서만 손을 대도록 구성되어 있습니다.
물론, 보안 때문에 그렇습니다.
해서 dice나 mxplayer등은 application에서 ndk를 이용해서 따로 구현한 것입니다.