-1

Android でRTMPを使用してストリームをダウンロードします。初めてライブラリを実行すると、すべて正常に動作します。2 回目は、アプリが RTMP ダウンロードを開始しません:/

過去 3 日間検索したところ、ネイティブ ライブラリを 2 回ロードしたりアンロードしたりすることはできず、問題を処理するには 3 つのオプションがあることがわかりました。

  1. カスタム クラス ローダーの使用 (System.gc() ライブラリがまだ読み込まれた後)
  2. 独自のプロセスでサービスを実行しています(機能しませんでした。サービスを強制終了した後もライブラリがロードされていました)。
  3. 経由でRTMP ライブラリをロードし、経由dlopenで閉じるネイティブ ライブラリを作成しますdlclose

それ以上のオプションはわかりません:/ネイティブライブラリを作成して他のライブラリをロードする方法さえわかりません:/

この RTMP ダンプを使用しました: https://github.com/eschriek/rtmpdump-android

4

1 に答える 1

0

OK、私はそれを行う方法を見つけました:)多分それは美しいものではありませんが、うまくいきます:

  1. サービスを作成します。

    import android.app.Service;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.IBinder;
    
    public class rtmpdumpService extends Service {
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onStart(Intent intent, int startId) {
            super.onStart(intent, startId);
            config = this;
            String extras = "";
            if(intent != null){
    
                //Get needed information
                extras = intent.getExtras().getString("rtmp");
            }
            else {
                this.stopSelf();
            }
            doWork(extras);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
    
        public void doWork(String rtmp){
            //Do work here: for example rtmpdump
            Rtmpdump dump = new Rtmpdump();
            dump.parseString(params[0]);
            System.exit(0);
            this.stopSelf();
        }
    }
    
  2. これらの属性を持つサービスとして AndroidManifest に登録します

    android:name=".rtmpdumpService"
    アンドロイド:エクスポートされた="偽"
    アンドロイド:プロセス=":rtmp"
  3. サービス開始:

    インテント rtmpdumpIntent = new Intent(getApplicationContext(), rtmpdumpService.class);
                eSendIntent.putExtra("rtmp", "RTMP コード");
                startService(rtmpdumpIntent);
    

終了するまで待たなければならない場合があります。

サービスが開始された後 (startService(rtmpdumpIntent):

do {
    try {
        Thread.sleep(500);
    }
    catch (InterruptedException e) {
        //Log
    }
} while( isServiceRunning(rtmpdumpService.class) == true);

isServiceRunning 関数:

    private boolean isServiceRunning(Class cl) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (cl.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }
于 2013-08-07T13:45:23.660 に答える