Почему воспроизведение GStreamer страдает при использовании APK из приложения Xamarin для Android? - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь получить пример приложения, предоставляемого средой потоковой передачи мультимедиа Gstreamer, для работы в качестве приложения Xamarin для Android. Приложение воспроизводит и отображает поток RTSP. Для этого я взял пример приложения Android (на основе Java, с некоторым взаимодействием C ++): https://github.com/centricular/android_rtsp_example и собрал его в виде файла AAR в Android-студии (как описано здесь https://developer.android.com/studio/projects/android-library).

Затем я сослался на файл AAR из моего приложения Xamarin, как описано здесь: https://docs.microsoft.com/en-us/xamarin/android/platform/binding-java-library/binding-an-aar.

Затем я вошел в свой файл AndroidManifest.xml для приложения Xamarin и в качестве основного вида деятельности указал действие, которое поставляется вместе с файлом AAR. Делая все это, насколько я знаю, у меня должно быть что-то, по сути, то же самое, что и оригинальный APK, созданный из Android Studio на чистой Java, но работающий в среде Xamarin. Все идет нормально. Все построено и развернуто. Приложение запускалось и работало так же, как и при сборке из Android Studio, за исключением одного: воспроизведение было очень, очень медленным и прерывистым, с множеством артефактов сжатия. Это НЕ тот случай, когда запускается тот же код / ​​конвейер из приложения, не принадлежащего Xamarin. У меня вопрос, что может быть причиной этого? Я сделал что-то глупое, когда пытался обернуть этот APK в Xamarin и запустить его? Не удалось ли мне включить аппаратное ускорение, которое включено в APK, которое не включено в приложении Xamarin? Некоторый аспект воспроизведения хуже, когда обернут в Xamarin, но я не уверен точно, что это могло бы быть.

В конечном счете, способ, которым приложение GStreamer рисует в Android, мне не понятен, но я знаю, что реальный код рисования реализован в C ++, и есть слой взаимодействия Java / C ++, который задействован (JNI_OnLoad и RegisterNatives) , Таким образом, может быть, что-то больше не ускоряется на оборудовании, но я не уверен, как это могло быть.

Итак, в итоге:

  • Существующий APK может быть собран и запущен на телефоне Android. Он воспроизводит поток RTSP очень хорошо, без артефактов дрожания или сжатия.
  • Строя APK как AAR и ссылаясь на него из Xamarin, я могу заставить плеер запускаться так же, как и при сборке в виде APK. Работают нажатия кнопок и т. Д., И видеоплеер показывает и подключается к потоку RTSP.
  • Производительность намного, намного ниже в приложении Xamarin, с сильным джиттером, потерями данных и артефактами сжатия, отображаемыми в визуальном окне.
  • Кроме настроек сборки (например, для создания AAR вместо APK из Android Studio) и изменения файла AndroidManifest.xml, изменения кода не производились (см. Ниже мой файл AndroidManifest.xml).

Есть мысли или отзывы?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.XamarinGstreamerTestAndroid" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="25" />
    <application android:allowBackup="true" 
               android:icon="@mipmap/ic_launcher" 
              android:label="@string/button_play" 
              android:roundIcon="@mipmap/ic_launcher_round" 
              android:supportsRtl="true" 
              android:theme="@style/AppTheme">
              </application>
        <activity android:name=".RTSPExample"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
</manifest>
...