Git Product home page Git Product logo

mux-stats-sdk-exoplayer's Introduction

Mux Stats SDK for ExoPlayer

This is the Mux wrapper around ExoPlayer, built on top of Mux's core Java library, providing Mux Data performance analytics for applications utilizing Google's ExoPlayer.

Usage

See full integration instructions here: https://docs.mux.com/guides/data/monitor-exoplayer

Add our maven repository

repositories {
  maven {
    url "https://muxinc.jfrog.io/artifactory/default-maven-release-local"
  }
}

Add a dependency compatible with your version of ExoPlayer. The full list of supported versions can be found here

api 'com.mux.stats.sdk.muxstats:MuxExoPlayer_(ExoPlayer SDK version with underscores):(Mux SDK version)'

Monitor your ExoPlayer

muxStatsExoPlayer = exoPlayer.monitorWithMuxData(
      context = requireContext(),
      envKey = "YOUR_ENV_KEY_HERE",
      playerView = playerView,
      customerData = customerData
    )

For more information, check out the integration guide

Contributing

The code in this repo conforms to the Google Java Style Guide. Run the reformatter on files before committing.

The code was formatted in Android Studio/IntelliJ using the Google Java Style for IntelliJ . The style can be installed via the Java-style section of the IDE preferences (Editor -> Code Style - >Java).

Documentation

See our docs for more information.

mux-stats-sdk-exoplayer's People

Contributors

com6056 avatar daytime-em avatar dependabot[bot] avatar jsanford8 avatar nbirkenshaw-mux avatar skidder avatar tomkordic avatar wtao-mux avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mux-stats-sdk-exoplayer's Issues

Use Player version and Player name from CustomerPlayerData config

In this SDK, the class com.mux.stats.sdk.core.model.CustomerPlayerData allows us to set the player name and player version but these values are not being used. In com.mux.stats.sdk.muxstats.MuxBaseExoPlayer the player name and player version are hardcoded as "ExoPlayer" and ExoPlayerLibraryInfo.VERSION respectively.

In some cases this is not desired, for example we integrated MUX in our player library and we would like to display our player name and version on the MUX dashboard instead of Exo player.

A solution would be to create a custom implementation of MUX SDK or forking this repository and changing those values, but these solutions are an overkill for something that simple.

Can this SDK use the values set in CustomerPlayerData for player version and player name and maybe default to the ExoPlayer values when these are not provided.

Duplicate Class Build Error when using ExoPlayer Amazon port with MuxExoPlayer v2.6.0

Hello Mux team!

In our project, we just upgraded the ExoPlayer from r2.12.1 to r2.16.1. So, we also upgraded MuxExoPlayer v2.4.15 for ExoPlayer r2.12.1 to MuxExoPlayer v2.6.0 for ExoPlayer r2.16.1. In this upgrade, we also started pulling the MuxExoPlayer library from your jfrog repository, rather than including the .AAR locally. This was successful, but I want to make you aware of an issue I ran into along the way.

To preface, we use Mux with the ExoPlayer Amazon port library, rather than Google's vanilla ExoPlayer.

When we upgraded, we tried to include the MuxExoPlayer library, along with the ExoPlayer Amazon port, in one of our project's modules this way:

api "com.amazon.android:exoplayer:$exo_player_version"
api "com.amazon.android:extension-workmanager:$exo_player_version"
api "com.amazon.android:extension-cast:$exo_player_version"
implementation 'com.google.ads.interactivemedia.v3:interactivemedia:3.24.0'
api('com.mux.stats.sdk.muxstats:MuxExoPlayer_r2_16_1:2.6.0')

However, when the app is compiled, the build fails with a list of duplicate class errors, like the following:

Duplicate class com.google.android.exoplayer2.AbstractConcatenatedTimeline found in modules jetified-exoplayer-core-2.16.1-runtime (com.amazon.android:exoplayer-core:2.16.1) and jetified-exoplayer-core-2.16.1-runtime (com.google.android.exoplayer:exoplayer-core:2.16.1)

You can view the entire list of duplicate classes here:
ExoPlayer-Build-Error.txt

If we replace the ExoPlayer Amazon port with the vanilla ExoPlayer, like below, then the build completes successfully:

api "com.google.android.exoplayer:exoplayer:$exo_player_version"
api "com.google.android.exoplayer:extension-workmanager:$exo_player_version"
api "com.google.android.exoplayer:extension-cast:$exo_player_version"
implementation 'com.google.ads.interactivemedia.v3:interactivemedia:3.24.0'
api('com.mux.stats.sdk.muxstats:MuxExoPlayer_r2_16_1:2.6.0')

And finally, in order to continue using the ExoPlayer Amazon port in conjunction with MuxExoPlayer, we have added the following exclude statements when including the MuxExoPlayer:

api "com.amazon.android:exoplayer:$exo_player_version"
api "com.amazon.android:extension-workmanager:$exo_player_version"
api "com.amazon.android:extension-cast:$exo_player_version"
implementation 'com.google.ads.interactivemedia.v3:interactivemedia:3.24.0'
api('com.mux.stats.sdk.muxstats:MuxExoPlayer_r2_16_1:2.6.0') {
    exclude(group: "com.google.android.exoplayer", module: "exoplayer")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-core")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-extractor")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-common")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-datasource")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-ui")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-transformer")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-smoothstreaming")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-rtsp")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-hls")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-dash")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-decoder")
    exclude(group: "com.google.android.exoplayer", module: "exoplayer-database")
}

When all of the duplicate ExoPlayer classes from Google are excluded, like above, the ExoPlayer classes from Amazon are kept, the build completes, and the app runs as expected. So, this solution works for us, but I wanted to make you aware of this, in case MuxExoPlayer is leaking its internal ExoPlayer dependencies. This issue did not occur until upgrading to MuxExoPlayer v2.6.0.

Problem at compile time with latest Android Studio 3.5.1

  • Cannot compile project after update to latest gradle plugin 3.5.1 and gradle wrapper 5.6.2-all
  • Simple update to latest Android Studio 3.5.1 and update gradle plugin to 3.5.1 and gradle wrapper 5.6.2-all and try to rebuild project.
  • ExoPlayer version 2.9.6 with Custom Integration based on the demo project.
  • There is no bug report and the problem is in compilation time. Might be a gradle incompatibility.
  • Works with gradle plugin 3.4.2 and gradle wrapper 5.1.1-all

Output
Caused by: com.android.tools.r8.utils.AbortException: Error: Default method desugaring of `com.mux.stats.sdk.muxstats.MuxStatsExoPlayer` failed because it's hierarchy is incomplete. The class `com.mux.stats.sdk.core.events.EventBus` is missing and it is the declared super class of `com.mux.stats.sdk.muxstats.MuxBaseExoPlayer`

Add ExoPlayer 2.16.1 support

Exoplayer released 2.16.x and we would love to update our app to it. Usually, major exoplayer's versions are incompatible, so mux SDK will block us from updating. I'm posting this issue for visibility

Mux init crash when use ExoPlayerImpl

I'm use ExoMedia library on my project that use ExoPlayerFactory.newInstance create player instance you can check here

java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.android.exoplayer2.Player$VideoComponent.setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)' on a null object reference
        at com.mux.stats.sdk.muxstats.e.<init>()
        at com.mux.stats.sdk.muxstats.MuxStatsExoPlayer.<init>()
        at com.mux.stats.sdk.muxstats.MuxStatsExoPlayer.<init>()
        at com.fiton.android.ui.inprogress.InProgressActivity.lambda$initMux$8(InProgressActivity.java:874)
        at com.fiton.android.ui.inprogress.-$$Lambda$InProgressActivity$5y8FZVwFcHxLWDh10AV5SP_HDN8.run(lambda)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:158)
        at android.app.ActivityThread.main(ActivityThread.java:7229)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Using `presentationChange` sets player dimensions to 0

Library version: 2.5.9 for ExoPlayer 2.15.1+ (https://github.com/muxinc/mux-stats-sdk-exoplayer/releases/download/v2.5.9/MuxExoPlayer-r2_15_1-release.aar)

When using the new feature implemented in 2.5.8 to tell Mux that the video is viewing full screen, the framework will stop reporting playerWidth and playerHeight - both are set to 0 in the events printed when verbose debug logging is enabled.

Steps to reproduce:

  1. when creating a session, detect that the video is showing in fullscreen and set the presentation mode using: muxStats.presentationChange(MuxSDKViewPresentation.FULLSCREEN)
  2. enable full debug logging with muxStats.enableMuxCoreDebug(true, true)
  3. run the app and check the logs. The PlayerData values for playerWidth and playerHeight are set to 0.

This alone wouldn't be a problem, but it completely removes video quality metrics related to video/player size.

Project with Mux 0.4.4 does not build

After updating mux-r2.8.0 to 0.4.4 the project does not build.

Error

Execution failed for task ':app:transformClassesWithInstantRunForStagingDebug'.
> com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: java.io.IOException: Failed to find byte code for com/google/ads/interactivemedia/v3/api/AdErrorEvent$AdErrorListener

In the integration guide there is nothing mentioned about IMA. Is this required?

2.4.12 - CustomerData - Obfuscated class?

New version of SDK - 2.4.12 for ExoPlayer 2.13.1.

With the old MuxStatsExoPlayer constructors being deprecated I've followed the example which created a com.mux.stats.sdk.core.model.CustomerData object and passes this in to the new constructor. However, we are unable to resolve this class name. Looking into the aar file I can see that this class has been obfuscated. I'm assuming this is a mistake?

Screenshot 2021-07-30 at 08 13 11

Usage of legacy support libraries

Hey team,

It seems that your SDK is still using legacy support libraries, we are getting this warning when we build our app:

WARNING:Your project has set android.useAndroidX=true, but configuration stagingDebugRuntimeClasspath still contains legacy support libraries, which may cause runtime issues.
This behavior will not be allowed in Android Gradle plugin 8.0.
Please use only AndroidX dependencies or set android.enableJetifier=true in the gradle.properties file to migrate your project to AndroidX (see https://developer.android.com/jetpack/androidx/migrate for more info).
The following legacy support libraries are detected:
stagingDebugRuntimeClasspath -> project :core -> project :analytics -> com.mux.stats.sdk.muxstats:MuxExoPlayer_r2_15_1:2.5.7 -> com.android.support:multidex:1.0.3

Is there any plan in your road map move aways from these libraries?

For ExoPlayer r2.11.x, monitoring ad playback via `com.google.android.exoplayer2.source.ads.AdsLoader` is not supported

In r2.11.x of ExoPlayer, Google modified how ads are handled, at least in their demo applications. This version introduced the com.google.android.exoplayer2.source.ads.AdsLoader class, which does not expose the same information that is exposed directly by the Google IMA AdsLoader.

If you run ads as they do in the demo application on htttps://github.com/google/exoplayer, you will likely see rebuffering during playback of the ads.

We need to support monitoring ads when loaded via this mechanism.

Missing hb events

Hello the Mux team,

I have a problem with hearbeat evens in the app. We are currently using:

  • MUX: com.mux.stats.sdk.muxstats:MuxExoPlayer_amznPort (v3.4.7)
  • ExoPlayer: com.amazon.android:exoplayer-* (v2.18.7)
    I'm able to see events like "e": "play","e": "pause" but I can't see "e": "hb". Instead of the hb events we can see the app sends "e": "requestcompleted" every few seconds. Some time ago we have been using:
  • MUX: com.mux.stats.sdk.muxstats:MuxExoPlayer_r2_11_1 (v3.1.0)
  • ExoPlayer: our implementation of the amazon player based on v2.11.3-41
    Back then we were able to see the hb events. We didn't change the code between versions.

I tried to figure this out by myself but I stuck. Shall we expect the hb events in the newest version of the sdk?

Question about Video Startup Time with pre-roll ad (Mux version 2.0.0)

Since we just integrated mux v2.0.0 (2.11.1.AAR), we have seen the Video Startup Time increasing with pre-roll ads playing, please see the screen shots below.

The Video Startup Time seems to be sum of Video Startup Preroll Request Time and Video Startup Preroll Load Time and it doesn't reflect the stream video startup time alone without pre-roll ads. Is this the intended metrics from Mux? Please clarify us about this since we rely on the video startup time as a metric to measure video quality.

More information from our part.
Exoplayer 2.11.8
Exoplayer extension-ima 2.11.8
Mux version 2.0.0

image
image

Live's duration and progress are wrong

I'm trying to play a live streaming by the example and saw that duration and progress of streaming are in correct. Duration starts then increases to 40(or 20) then stop and progress will become -1 after a while

Mux plugin 3.3.3 crashing app

I'm stepping in here for our dev team so please bear with any inconsistencies in this report.

We have recently upgraded our Android player SDK to the latest Mux version 3.3.3 from previous 2.5.7. However, right away it brought many instabilities with our test streaming app crashing immediately after initializing player, sometimes when entering fullscreen and so on. No data being received in the dashboard.

From my undestanding, there was a number of changes introduced in version 3.0.0, namely removing some stuff like CustomerPlayerData. Our dev team comments, though, that the Mux plugin code for ExoPlayer 2.18.1+

studio64_EVnoTaInU7

still contains these classes and our player SDK is still using them. When I look at one of the attached stack traces, it directly complains about CustomerPlayerData, so it appears there's a connection.

Are you able to glean from the attached bug report and stack traces if that is the case and can you please comment on why these classes are still available if they were mentioned as deleted?
Can you then please confirm that everything is in order in Mux plugin 3.3.3 and if our first course of action in that case is now adhering to changes listed in https://github.com/muxinc/mux-stats-sdk-exoplayer/releases/tag/v3.0.0 or is there something else?

Thanks.

bugreport-POT-LX1EEA-HUAWEIPOT-L21-2023-04-12-09-37-10.zip
d454be4a-c82b-5da1-a021-285efe0af239.log
a723781a-c0eb-54f0-a0dc-5fbe1ecd907a.log

ConcurrentModificationException when calling updateCustomerData

Mux library version: 2.5.2 for Exoplayer 2.14.1+

There have been some reports of a crash when attempting to update the video data. The application will crash with an error:

Fatal Exception: java.util.ConcurrentModificationException
       at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:757)
       at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:780)
       at com.mux.stats.sdk.os.MuxDictionary.c(MuxDictionary.java:17)
       at com.mux.stats.sdk.core.model.BaseQueryData.keys(BaseQueryData.java:2)
       at com.mux.stats.sdk.core.model.BaseQueryData.d(BaseQueryData.java:2)
       at com.mux.stats.sdk.core.model.CustomerData.setCustomerVideoData(CustomerData.java:4)
       at com.mux.stats.sdk.muxstats.MuxStats.updateCustomerData(MuxStats.java:4)
       at com.mux.stats.sdk.muxstats.MuxStats.updateCustomerData(MuxStats.java:4)
       at com.mux.stats.sdk.muxstats.MuxBaseExoPlayer.updateCustomerData(MuxBaseExoPlayer.java:346)

This happens when calling:

val videoData = muxStats.customerData.customerVideoData
videoData.videoTitle = "newTitle"
muxStats.updateCustomerData(muxStats.customerData.customerPlayerData, videoData)

I realise this version of updateCustomerData call has recently been deprecated. We will probably switch to use the new approach, but it'd be good to fix this problem, or at least verify it won't happen with updateCustomerData(CustomerData data).

Note that it probably won't be possible to switch to the new call as long as this issue isn't fixed: #137

Remove Google Interactive Media Ads dependency

As of release 0.4.5 a transient dependency to Google Interactive Media Ads(IMA) has been introduced and seems to be mandatory. The size of this dependency is significant.

Would you consider making this optional instead?

Crash on `MuxStatsExoPlayer.updateCustomerData(CustomerData)`

Mux SDK version 2.4.14 for ExoPlayer 2.14.1+
ExoPlayer version 2.14.2

The call updateCustomerData(CustomerData) causes a crash when trying to request an update using the call using a new instance of CustomerData:

 Process: no.tv2.sumo.debug, PID: 12614
    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.mux.stats.sdk.core.model.b.isEqualTo(com.mux.stats.sdk.core.model.b)' on a null object reference
        at com.mux.stats.sdk.muxstats.g.a(Unknown Source:65)
        at com.mux.stats.sdk.muxstats.e.updateCustomerData(Unknown Source:2)
        at [app's call to Mux SDK]

The crash does not happen when using any of the deprecated updateCustomerData methods. When using an updated version of existing CustomerData it does not crash, but the changes are not applied (not visible in the dashboard).

Code sample below. It makes no difference whether updatedVideoData is an entirely new instance of CustomerVideoData or a modified instance from muxStats is passed.

val muxStats: MuxStatsExoPlayer
// muxStats is initialised and starts tracking. The constructor with `CustomerData` is used.
// 1. using deprecated method - use current player data, replace videoData - ok.
muxStats.updateCustomerData(muxStats.customerData.customerPlayerData, updatedVideoData) 
// 2. using a modified instance of CustomerData - does not crash, but in the dashboard the title for this view is not set.
val data = muxStats.customerData
data.customerVideoData.videoTitle = "Updated Title"
muxStats.updateCustomerData(data)
// 3. using a new instance CustomerData - use current player and view data, replace videoData - crash.
muxStats.updateCustomerData(
    CustomerData(
        muxStats.customerData.customerPlayerData,
        updatedVideoData,
        muxStats.customerData.customerViewData
    )
)

Application crashing in onAdEvent with 2.11.1 AAR

We are using mux-r2.11.1.aar and Exoplayer IMA extension 2.11.0 in our project. Sometimes while trying to play videos, this crash is occurring. Kindly helps us in understanding reason for this crash.

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.WeakReference.get()' on a null object reference
at com.mux.stats.sdk.muxstats.a.onAdEvent(a.java:4)
at com.google.ads.interactivemedia.v3.internal.acv.a(acv.java:70)
at com.google.ads.interactivemedia.v3.internal.acv.a(acv.java:108)
at com.google.ads.interactivemedia.v3.internal.acl.a(acl.java:63)
at com.google.ads.interactivemedia.v3.internal.aeb.e(aeb.java:174)
at com.google.ads.interactivemedia.v3.internal.aeb.a(aeb.java:5)
at com.google.ads.interactivemedia.v3.internal.adz.b(adz.java:42)
at com.google.ads.interactivemedia.v3.internal.aea.shouldOverrideUrlLoading(aea.java:4)
at android.webkit.WebViewClient.shouldOverrideUrlLoading(WebViewClient.java:77)
at org.chromium.android_webview.AwContentsClientBridge.shouldOverrideUrlLoading(AwContentsClientBridge.java:16)
at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
at android.os.MessageQueue.next(MessageQueue.java:326)
at android.os.Looper.loop(Looper.java:181)
at android.app.ActivityThread.main(ActivityThread.java:7073)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

Proguard rules missing for `com.mux.stats.sdk.muxstats:MuxExoPlayer_r2_15_1:2.5.7`

Hey team!

Since this update r2_15_1:2.5.7, we had to add 2 new rules in our proguard rules to make the build go through:

### Exoplayer2 x MuxStats
-dontwarn com.google.android.exoplayer2.**
-dontwarn com.google.ads.**

otherwise we were facing this issue:

WARNING:R8: Missing class com.google.ads.interactivemedia.v3.api.AdErrorEvent$AdErrorListener (referenced from: com.mux.stats.sdk.muxstats.AdsImaSDKListener)
Missing class com.google.ads.interactivemedia.v3.api.AdEvent$AdEventListener (referenced from: com.mux.stats.sdk.muxstats.AdsImaSDKListener)
Missing class com.google.android.exoplayer2.source.rtsp.RtspMessageChannel$MessageParser$ReadingState (referenced from: int com.google.android.exoplayer2.source.rtsp.RtspMessageChannel$MessageParser.state)

Maybe worth adding documentation around this or maybe is there anything that can be done on your side?

MuxStatsExoPlayer callback NPE crash

Hello, been encountering a null pointer exception crash in your latest 2.13.1/2.4.9 aar of your SDK

2021-06-09 12:19:11.988 25266-25266/com.viki.android E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.viki.android, PID: 25266
    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.mux.stats.sdk.core.model.a.a(java.lang.Long)' on a null object reference
        at com.mux.stats.sdk.muxstats.e$c.a(Unknown Source:12)
        at com.mux.stats.sdk.muxstats.e$e.a(Unknown Source:0)
        at com.mux.stats.sdk.muxstats.e$d.a(Unknown Source:29)
        at com.mux.stats.sdk.muxstats.MuxStatsExoPlayer.onLoadCompleted(Unknown Source:16)
        at com.google.android.exoplayer2.analytics.AnalyticsCollector.lambda$onLoadCompleted$28(AnalyticsCollector.java:503)
        at com.google.android.exoplayer2.analytics.-$$Lambda$AnalyticsCollector$LCUClj88hG_1RJ03wPFhEhogQu4.invoke(Unknown Source:8)
        at com.google.android.exoplayer2.util.ListenerSet$ListenerHolder.invoke(ListenerSet.java:297)
        at com.google.android.exoplayer2.util.ListenerSet.lambda$queueEvent$0(ListenerSet.java:184)
        at com.google.android.exoplayer2.util.-$$Lambda$ListenerSet$NbKDn9xtItiyMgYZmjIx_Sv1FFQ.run(Unknown Source:6)
        at com.google.android.exoplayer2.util.ListenerSet.flushEvents(ListenerSet.java:205)
        at com.google.android.exoplayer2.util.ListenerSet.sendEvent(ListenerSet.java:220)
        at com.google.android.exoplayer2.analytics.AnalyticsCollector.sendEvent(AnalyticsCollector.java:797)
        at com.google.android.exoplayer2.analytics.AnalyticsCollector.onLoadCompleted(AnalyticsCollector.java:500)
        at com.google.android.exoplayer2.source.MediaSourceEventListener$EventDispatcher.lambda$loadCompleted$1$MediaSourceEventListener$EventDispatcher(MediaSourceEventListener.java:301)
        at com.google.android.exoplayer2.source.-$$Lambda$MediaSourceEventListener$EventDispatcher$ZuTEoXsbK3i0dfIxRwW-S0zQ6UA.run(Unknown Source:8)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

Dependencies used:
Mux SDK aar v2.13.1 (v2.4.9)
Exoplayer v2.13.3
IMA SDK v3.24.0 (we depend on IMA SDK in our project)

Environment:
Android API 30 Emulator

This doesn't happen in your previous version Mux SDK aar v2.13.1 (v2.4.8) combined with IMA SDK 3.19.4 (3.22.3 up to 3.24.0 still crashes, only the mux 2.4.8 and IMA 3.19.4 combination seems to be stable). Kindly advise if this indeed is an issue on your end / a fix will be in the works. Thanks!

Edit: Note We depend on IMA SDK in our own project so it might have an effect on the dependency resolution, going to try matching it with what mux SDK uses IMA 3.9.0 is too far back and we are already using most of their newer apis on certain classes

AAR file is 16.6 MB in size

AAR file of the latest version 2.3.0 has size 16.6MB. It is caused by test file sample-1280x720.mkv in assets folder.

mux-r2.8.0 crash with Gradle build tool 3.5.0

Description

When the app tries to instantiate a MuxStatsExoPlayer, it crashes with an AbstractMethodError. This only happens when building with Gradle buildTypes field "debuggable false". This is did not happen in ExoPlayer v2.9.6.

Code

private lateinit var muxStats: MuxStatsExoPlayer

private fun configurePlayer(context: Context) {
        val userAgent = Util.getUserAgent(context, "appName")
        val dataSourceFactory = DefaultDataSourceFactory(context, userAgent)
        val uri = Uri.parse("videoUrl")
        val videoSource = HlsMediaSource.Factory(dataSourceFactory).createMediaSource(uri)
        player.prepare(videoSource)

        val customerPlayerData = CustomerPlayerData()
        customerPlayerData.environmentKey = muxKey
        customerPlayerData.viewerUserId = userId

        val customerVideoData = CustomerVideoData()
        customerVideoData.videoId = videoId
        customerVideoData.videoTitle = title
        customerVideoData.videoSeries = catTitle
        customerVideoData.videoDuration = duration

        // Crashes here
        muxStats = MuxStatsExoPlayer(
            context,
            player,
            PLAYER_NAME,
            customerPlayerData,
            customerVideoData
        )

        val size = Point()
        activity?.windowManager?.defaultDisplay?.getSize(size)
        muxStats.setScreenSize(size.x, size.y)
        muxStats.setPlayerView(playerView.videoSurfaceView)

        player.playWhenReady = true
    }

Crash when mux receives AnalyticsCollector.onLoadCompleted

The project uses ExoPlayer 2.13.3
Mux version 2.4.9 for ExoPlayer 2.13.1

I won't go into details here because I bet it's something wrong with my initialisation (demo works fine for seemingly similar setup). I would appreciate if you could help me deciphering this obfuscated stacktrace.
By the way, is there no way to de-obfuscate these stacktraces? It makes it really difficult to troubleshoot.
Thanks!

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.mux.stats.sdk.core.model.a.a(java.lang.Long)' on a null object reference
        at com.mux.stats.sdk.muxstats.e$c.a(Unknown Source:12)
        at com.mux.stats.sdk.muxstats.e$e.a(Unknown Source:0)
        at com.mux.stats.sdk.muxstats.e$d.a(Unknown Source:29)
        at com.mux.stats.sdk.muxstats.MuxStatsExoPlayer.onLoadCompleted(Unknown Source:16)
        at com.google.android.exoplayer2.analytics.AnalyticsCollector.lambda$onLoadCompleted$28(AnalyticsCollector.java:503)
        at com.google.android.exoplayer2.analytics.-$$Lambda$AnalyticsCollector$LCUClj88hG_1RJ03wPFhEhogQu4.invoke(Unknown Source:8)
        at com.google.android.exoplayer2.util.ListenerSet$ListenerHolder.invoke(ListenerSet.java:297)
        at com.google.android.exoplayer2.util.ListenerSet.lambda$queueEvent$0(ListenerSet.java:184)
        at com.google.android.exoplayer2.util.-$$Lambda$ListenerSet$NbKDn9xtItiyMgYZmjIx_Sv1FFQ.run(Unknown Source:6)
        at com.google.android.exoplayer2.util.ListenerSet.flushEvents(ListenerSet.java:205)
        at com.google.android.exoplayer2.util.ListenerSet.sendEvent(ListenerSet.java:220)
        at com.google.android.exoplayer2.analytics.AnalyticsCollector.sendEvent(AnalyticsCollector.java:797)
        at com.google.android.exoplayer2.analytics.AnalyticsCollector.onLoadCompleted(AnalyticsCollector.java:500)
        at com.google.android.exoplayer2.source.MediaSourceEventListener$EventDispatcher.lambda$loadCompleted$1$MediaSourceEventListener$EventDispatcher(MediaSourceEventListener.java:301)
        at com.google.android.exoplayer2.source.-$$Lambda$MediaSourceEventListener$EventDispatcher$ZuTEoXsbK3i0dfIxRwW-S0zQ6UA.run(Unknown Source:8)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Implement `updateCustomerData` for allowing metadata updates after initial load.

There are certain use cases where it is important to let people update certain metadata fields after the initial initialization of metadata. One such use case is where the video_cdn is not known at start time, and we have no way to automatically pull that via headers. In this way, they need to be able to update what is in CustomerVideoData and CustomerPlayerData, which should then be sent to the backend on the next beacon.

In order to do this, we should implement muxStatsExoPlayer.updateCustomerData(CustomerVideoData, CustomerPlayerData), that takes an instance of each type of customer data (or null), and makes sure that gets passed back down to core. You will need to implement something like muxStats.updateCustomerVideoData(CustomerVideoData) and muxStats.updateCustomerPlayerData(CustomerPlayerData) in MuxStats.java in core, which will take these new values, store them in the instance variables, and dispatch a new DataEvent (like is done in init).

If null is passed for either, do not overwrite what is already in core (i.e. this does not allow you to clear out either of the Customer*Data objects).

It is expected that customers will provide the entirety of the configuration (they will need to keep a reference to it) even if they just want to update one value. To help customers out, we should add a muxStats.getCustomerVideoData() and muxStats.getCustomerPlayerData() that returns the most recent reference, and then they can pass it back in. We'll have to expose that inside MuxStatsExoPlayer as well (after exposing it in core).

Expected workflow would be:

CustomerVideoData customerVideoData = muxStatsExoPlayer.getCustomerVideoData();
CustomerVideoData customerPlayerData = muxStatsExoPlayer.getCustomerPlayerData();
customerVideoData.setVideoCDN("new CDN");
...
muxStatsExoPlayer.updateCustomerData(customerVideoData, customerPlayerData);

All types of Renderer issues are not captured

Currently, MuxStatsExoPlayer is not capturing all types of TYPE_RENDERER errors. It is only capturing errors which are of type DecoderInitializationException

Is there any reason others are not being captured?

Support ExoPlayer 2.13

We need a version that supports ExoPlayer 2.13.

We tried using 2.13 with the 2.12 version of the plugin but this caused crashes when playing video (player worked fine without the plugin so it's not the player implementation)

2.7.0 - Package missing

Screenshot 2022-04-22 at 08 29 09

Updated to 2.7.0 for Exo 2.16.1 and the core package is missing. If there has been a fundamental change like this it should be in the release notes (and I can't see any reference to this), or there is an issue with the build (this has happened before so checking)

Crash when timeline changes after clearing media items.

Receiving a crash:

I've tried multiple exoplayer and mux versions.

Mux: 3.1.0
ExoPlayer: 2.18.1

java.lang.IndexOutOfBoundsException
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.Timeline$1.getWindow(Timeline.java:965)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.Timeline.getWindow(Timeline.java:1085)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.mux.stats.sdk.muxstats.internal.ExoAnalyticsListener.onTimelineChanged(ExoAnalyticsListener.kt:87)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.analytics.AnalyticsCollector.lambda$onTimelineChanged$33(AnalyticsCollector.java:576)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.analytics.-$$Lambda$AnalyticsCollector$J2ak5u9-h8YKLNPRdqAY9RZtP-I.invoke(Unknown Source:6)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.util.ListenerSet$ListenerHolder.invoke(ListenerSet.java:261)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.util.ListenerSet.lambda$queueEvent$0(ListenerSet.java:170)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.util.-$$Lambda$ListenerSet$NbKDn9xtItiyMgYZmjIx_Sv1FFQ.run(Unknown Source:6)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.util.ListenerSet.flushEvents(ListenerSet.java:191)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.util.ListenerSet.sendEvent(ListenerSet.java:206)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.analytics.AnalyticsCollector.sendEvent(AnalyticsCollector.java:897)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.analytics.AnalyticsCollector.onTimelineChanged(AnalyticsCollector.java:573)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.ExoPlayerImpl.lambda$updatePlaybackInfo$9(ExoPlayerImpl.java:1268)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.-$$Lambda$ExoPlayerImpl$s87MOCoD68VG7BJLWqHTmwcZoE0.invoke(Unknown Source:6)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.util.ListenerSet$ListenerHolder.invoke(ListenerSet.java:261)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.util.ListenerSet.lambda$queueEvent$0(ListenerSet.java:170)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.util.-$$Lambda$ListenerSet$NbKDn9xtItiyMgYZmjIx_Sv1FFQ.run(Unknown Source:6)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.util.ListenerSet.flushEvents(ListenerSet.java:191)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.ExoPlayerImpl.updatePlaybackInfo(ExoPlayerImpl.java:1366)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.ExoPlayerImpl.removeMediaItems(ExoPlayerImpl.java:493)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.SimpleExoPlayer.removeMediaItems(SimpleExoPlayer.java:1173)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.BasePlayer.clearMediaItems(BasePlayer.java:84)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.ForwardingPlayer.clearMediaItems(ForwardingPlayer.java:133)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at youversion.media.service.MediaService$MediaPlaybackPreparer.onPrepareFromMediaId(MediaService.kt:631)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector$ComponentListener.onPrepareFromMediaId(MediaSessionConnector.java:1319)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at android.support.v4.media.session.MediaSessionCompat$Callback$MediaSessionCallbackApi21.onPrepareFromMediaId(MediaSessionCompat.java:1841)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at android.media.session.MediaSession$CallbackMessageHandler.handleMessage(MediaSession.java:1599)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:201)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at android.os.Looper.loop(Looper.java:288)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7898)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
11-10 08:46:47.502 6336 6336 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

Issue with Video startup time

We are using latest v2.0.0 version of the Mux SDK (mux-r2.11.1.aar) with Exoplayer 2.11.0 and IMA extension SDK 2.11.0

On our dashboard we are getting more numbers of Exit Before Video Starts percentage. In our investigations, we found that it is happening because for some of the videos Video Startup time is not getting recorded as playing event is not tracked though timeline shows that video played. Duration shown on timeline is low as few seconds though. Can you help us with this?

AbstractMethodError when debuggable is false

Crash when running app with debuggable false.

Checkout the demo app linked here https://github.com/cf256/exoplayermux.
When debuggable is true for the debug flavor, everything is fine. When it is false the app crashes.

Crash:
E FATAL EXCEPTION: main E Process: no.rikstv.muxexoexample, PID: 14107 E java.lang.AbstractMethodError: abstract method "void com.google.android.exoplayer2.analytics.AnalyticsListener.onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener$EventTime, com.go ogle.android.exoplayer2.MediaItem, int)" E at com.google.android.exoplayer2.analytics.AnalyticsCollector.lambda$onMediaItemTransition$34(AnalyticsCollector.java:578) E at com.google.android.exoplayer2.analytics.-$$Lambda$AnalyticsCollector$DGKi9OUzTZtRXnRKtCVi5vrQrEQ.invoke(Unknown Source:8) E at com.google.android.exoplayer2.util.ListenerSet$ListenerHolder.invoke(ListenerSet.java:297) E at com.google.android.exoplayer2.util.ListenerSet.lambda$queueEvent$0(ListenerSet.java:184) E at com.google.android.exoplayer2.util.-$$Lambda$ListenerSet$NbKDn9xtItiyMgYZmjIx_Sv1FFQ.run(Unknown Source:6) E at com.google.android.exoplayer2.util.ListenerSet.flushEvents(ListenerSet.java:205) E at com.google.android.exoplayer2.util.ListenerSet.sendEvent(ListenerSet.java:220) E at com.google.android.exoplayer2.analytics.AnalyticsCollector.sendEvent(AnalyticsCollector.java:797) E at com.google.android.exoplayer2.analytics.AnalyticsCollector.onMediaItemTransition(AnalyticsCollector.java:575) E at com.google.android.exoplayer2.ExoPlayerImpl.lambda$updatePlaybackInfo$8(ExoPlayerImpl.java:1021) E at com.google.android.exoplayer2.-$$Lambda$ExoPlayerImpl$hCy9GuyuWqdycGpxOBepZjyxPeQ.invoke(Unknown Source:6) E at com.google.android.exoplayer2.util.ListenerSet$ListenerHolder.invoke(ListenerSet.java:297) E at com.google.android.exoplayer2.util.ListenerSet.lambda$queueEvent$0(ListenerSet.java:184) E at com.google.android.exoplayer2.util.-$$Lambda$ListenerSet$NbKDn9xtItiyMgYZmjIx_Sv1FFQ.run(Unknown Source:6) E at com.google.android.exoplayer2.util.ListenerSet.flushEvents(ListenerSet.java:205) E at com.google.android.exoplayer2.ExoPlayerImpl.updatePlaybackInfo(ExoPlayerImpl.java:1101) E at com.google.android.exoplayer2.ExoPlayerImpl.setMediaSourcesInternal(ExoPlayerImpl.java:1195) E at com.google.android.exoplayer2.ExoPlayerImpl.setMediaSources(ExoPlayerImpl.java:397) E at com.google.android.exoplayer2.ExoPlayerImpl.setMediaItems(ExoPlayerImpl.java:365) E at com.google.android.exoplayer2.BasePlayer.setMediaItems(BasePlayer.java:49) E at com.google.android.exoplayer2.BasePlayer.setMediaItem(BasePlayer.java:34) E at com.google.android.exoplayer2.SimpleExoPlayer.setMediaItem(SimpleExoPlayer.java:1322) E at no.rikstv.muxexoexample.MainActivity.initializePlayer(MainActivity.kt:82) E at no.rikstv.muxexoexample.MainActivity.onCreate(MainActivity.kt:35) E at android.app.Activity.performCreate(Activity.java:8000) E at android.app.Activity.performCreate(Activity.java:7984) E at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) E at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3404) E at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595) E at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) E at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) E at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) E at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) E at android.os.Handler.dispatchMessage(Handler.java:106) E at android.os.Looper.loop(Looper.java:223) E at android.app.ActivityThread.main(ActivityThread.java:7660) E at java.lang.reflect.Method.invoke(Native Method) E at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) E at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

This is using Exoplayer 2.13.2 and mux 2.13.1. Reproduced on Pixel 3a running Android 11 (I'm pretty sure it is any device). It could be related to this issue (#18?) maybe?

Mux should not set VideoFrameMetadataListener.

Installed version: 2.4.10

Mux creates its own implementation of VideoFrameMetadataListener inside MuxBasePlayer and then sets it on the player's video component.

This hijacks the use of that callback outside of Mux. From ExoPlayer's documentation (source):

This method is intended to be called by the same component that sets the {@link Surface} onto which video will be rendered. If using ExoPlayer's standard UI components, this method should not be called directly from application code.

It should be clear that given above, Mux is not the right place to set VideoFrameMetadataListener.

  • The best solution would be to not set this listener in Mux. As ExoPlayer's documentation mentions further, it is used by ExoPlayer's standard UI components, meaning working around any solutions would be cumbersome.

  • At the very least Mux should provide a way to share the callback with other components.

App crashing in release builds

Hi Team,
App is crashing with release apk with Mux dependency. (everything is fine with Debug apk)
My AGP version is 7.4.1.
This is the Fatal Error for the crash:
java.lang.NoSuchMethodError: No virtual method f()I in class Lorg/json/JSONArray; or its super classes (declaration of 'org.json.JSONArray' appears in /apex/com.android.art/javalib/core-libart.jar)

Please note I have minify enabled for release builds, is there something which i need to add in pro-guard?
I am using Mux 3.2.0 with exo player version 2.16.1.

Please help me if there is something i am missing, Thank you.

ExoPlayer 2.15.x support

We need a version that supports ExoPlayer 2.15.

We are currently using 2.15 with the 2.14 version of the plugin but this caused some crashes when playing video (player worked fine without the plugin so it's not the player implementation).

ExoPlayer 2.15 fixes several issues that were affecting all our Android users.

Host mux-stats-sdk-exoplayer on Maven

Or some such place. The issue is that transitive dependency resolution cannot be performed on AARs included directly in the libs folder. This would also simplify the inclusion of our SDK within applications that use ExoPlayer.

We should investigate jcenter and whether we can host our AAR there (with all of the different versions/flavors) correctly, to make people's lives easier.

We have this almost complete here:
#9
https://github.com/muxinc/mux-stats-sdk-java/pull/21

Steps

  • [] Finish Javadocs for Muxcore
  • [] Finish Javadocs for Exoplayer
  • [] Review Javadocs
  • [] Modify the README for Exoplayer to include integration steps for Maven dependency
  • [] Modify public docs on docs.mux.com with integration steps

Multiple events entries shown on mux dashboard

I'm using exo player version 2.18.2 & Mux dependency is com.mux.stats.sdk.muxstats:MuxExoPlayer_r2_18_1:$3.3.1

Now when I play some video it logs multiple entries on mux dashboard.
Out or all entries only one entry is having correct data & remaining entries are having null data (N/A) in each field

screenshot-dashboard mux com-2023 03 15-19_09_03

Integration of AAR is not straight forward in multi-module projects

Hello,

As far as I can tell, mux releases are only delivered in the form of AARs. This becomes an issue in multimodule projects where a library module depends on mux. This is because the android gradle plugin has never officially supported "fat AARs". This is rarely an issue, because most all dependencies are available via a remote repository. In fact, we have ~80 dependencies and mux is the only aar in the project.

Can mux make their latest releases available through a remote repository? If not, what is the recommended path?

Conflict with other libraries (Duplicate class a.a.a.a.a.a)

In our project we're having problems when trying to switch to latest v2.0.0 version of library (mux-r2.11.1.aar).
During build of project, we can see following error (which is causing build to fail)

Duplicate class a.a.a.a.a.a found in modules jetified-mux-r-2.11.1-v2.0.0-runtime.jar (our.project.package.name:mux-r:2.11.1-v2.0.0) and jetified-sdk-4.7.8-runtime.jar (tv.teads.sdk.android:sdk:4.7.8)

When looking inside of those libraries, we can see that during build (made by authors), proguard did generate class with the same name "a.a.a.a.a.a" (of course content of those classes are different). Also the same thing can be observed when looking into mapping files (for 2.0.0 release).

From mapping for 2.11.1

com.mux.stats.sdk.os.MuxArray -> a.a.a.a.a.a:
com.mux.stats.sdk.os.MuxDictionary -> a.a.a.a.a.b:

From mapping for 2.10.6

com.mux.stats.sdk.os.MuxArray -> com.mux.stats.sdk.a.a:
com.mux.stats.sdk.os.MuxDictionary -> com.mux.stats.sdk.a.b:

From mapping for 2.9.6

com.mux.stats.sdk.os.MuxArray -> a.a.a.a.a.a:
com.mux.stats.sdk.os.MuxDictionary -> a.a.a.a.a.b:

As we can see, during build MuxArray and MuxDictionary classes were renamed to a.a.a.a.a.a and a.a.a.a.a.b which could (and like we see will) conflict with some other libraries with similar "problem".

The solution would be to fix proguard rules for this library, so they will generate correct obfuscated classes.
For example in release 1.5.0 it was (taken from 2.11.1 mapping file)
com.mux.stats.sdk.os.MuxArray -> com.mux.stats.sdk.a.a:

mux-r2.8.0 sends "Player is accessed on the wrong thread" warning

After updating version to mux-r2.8.0 I notice that "Player is accessed on the wrong thread" warning is sent repeatedly in Logcat console. The last version has no this issue so I suspect that this could possibly affect ExoPlayer performance on my application? Or this is a known issue? How can I handle with this issue? Thanks.

Rebuffering stats doesn't seem to match the reality

I've recently implemented mux.com to gather statistics from exoPlayer. In the dashboard, I can see that there was no rebuffering. The score is 100 and there is 0 rebuffer count. I'm pretty sure this is wrong as I had some rebuffering myself and other users also reported the issue with streaming.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.