6

デフォルトでは、android Gigerbread 2.3 は PV_Player (opencore ライブラリ) を使用します。システムのbuild.propファイルにパッチを当てる必要があるだけの解決策が1つ見つかりましたが、システムにパッチを適用したくありません。StageFright プレーヤーを使用する Android メディア フレームワークを使用して、独自のライブラリを作成したいと考えています。libmediaplayerservice がプレーヤーの選択を決定することを知っています。メディアフレームワークを見てください

Androidフレームワークに従ってライブラリを作成したい -

  • libmedia_jni_own
  • libmedia_own
  • libmediaplayerservice_own

    しかし問題は、libmedia が libmediaplayerservice ライブラリと直接対話せず、libmediaplayerservice ライブラリに直接依存していないことです。そのため、stagefright プレーヤーを作成できません。libmedia は、Binder IPC メカニズムを介して libmediaplayerservice ライブラリと通信します。libmedia ソース ライブラリにパッチを適用して、libmediaplayerservice ライブラリにアクセスし、StageFright プレーヤーを作成できるようにする方法と、オープンコア ライブラリの代わりに StageFright レコーダーなどにアクセスできるようにする方法を教えてください。

  • 4

    2 に答える 2

    1

    あなたが言及しているBinderメカニズムのAndroidソースコードを見ると、メソッド'getMediaPlayerService()'を見て、サービスマネージャーがメディアサービスを処理する方法を確認する必要があります。このメソッドにパッチを適用し、サービスを適切に定義できれば、問題はありません。

    IMediaDeathNotifier::getMediaPlayerService()
    {
        LOGV("getMediaPlayerService");
        Mutex::Autolock _l(sServiceLock);
        if (sMediaPlayerService.get() == 0) {
            sp<IServiceManager> sm = defaultServiceManager();
            sp<IBinder> binder;
            do {
                binder = sm->getService(String16("media.player"));
                if (binder != 0) {
                    break;
                 }
                 LOGW("Media player service not published, waiting...");
                 usleep(500000); // 0.5 s
            } while(true);
    
            if (sDeathNotifier == NULL) {
            sDeathNotifier = new DeathNotifier();
        }
        binder->linkToDeath(sDeathNotifier);
        sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);
        }
        LOGE_IF(sMediaPlayerService == 0, "no media player service!?");
        return sMediaPlayerService;
    }
    

    問題のメソッドは次の場所にあります。 frameworks/base/media/libmedia/IMediaDeathNotifier.cpp

    また、サービスは次のように呼び出すことで設定されます。

     void MediaPlayerService::instantiate() {
                 defaultServiceManager()->addService(
                 String16("media.player"), new MediaPlayerService());
     }
    

    これは次の場所にあります。/frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp

    于 2012-05-22T11:20:37.190 に答える
    1

    システムにパッチを適用しないと、メディア サービスの動作を変更できないと思います。メディア サービスとそのライブラリはシステム パーティションにあるため、jni の負荷を乗っ取る方法はありません。AOSP 以外の rom (在庫の Samsung、HTC など) を実行している場合、在庫の rom には独自のライブラリへのリンクが多数含まれているため、ライブラリを交換することはできません。

    于 2012-05-21T22:04:37.283 に答える