androidx / media

Jetpack Media3 support libraries for media use cases, including ExoPlayer, an extensible media player for Android
https://developer.android.com/media/media3
Apache License 2.0
1.67k stars 399 forks source link

Video freeze and audio continue playing when adapt from high bitrate to low on Pixel 6, Pixel 7, Pixel 7a with os 14 onwards #1615

Open zgzong opened 2 months ago

zgzong commented 2 months ago

Version

Media3 main branch

More version details

1.2.1 1.4.0

Devices that reproduce the issue

Pixel 6 with android 14 Pixel 7 with android 15 beta 4 Pixel 7a with android 14

Devices that do not reproduce the issue

Pixel 6/7/7a with android 13

Reproducible in the demo app?

Yes

Reproduction steps

Play a Dash stream, Allow player ABR engine to adapt bitrate from high to lower,

Expected result

The stream continuously plays smoothly, audio and video are sync

Actual result

Audio is playing but video frame is freeze no updates, can't automatically recovery.

Decoder doesn't throw any exception or error.

Media

Stream will share via email.

Bug Report

icbaker commented 2 months ago

I'm not able to reproduce this. I tried your stream on a Pixel 7a running Android 15 (AP31.240617.010) and modified the ExoPlayer demo app to force switching between tracks using RandomTrackSelection, by making the following change in PlayerActivity.initializePlayer:

ExoPlayer.Builder playerBuilder =
    new ExoPlayer.Builder(/* context= */ this)
        .setMediaSourceFactory(createMediaSourceFactory())
        .setTrackSelector(new DefaultTrackSelector(this, new RandomTrackSelection.Factory(/* seed= */ 0)));

I see the selected track changing in logcat:

downstreamFormat [eventTime=0.90, mediaPos=3.98, window=0, period=0, id=dzHACQ6f, mimeType=video/avc, container=video/mp4, bitrate=920000, codecs=avc1.4d4029, drm=[playready,unknown (adb41c24-2dbf-4a6d-958b-4457c0d27b95),widevine,cenc], res=640x360, fps=25.0]
downstreamFormat [eventTime=2.31, mediaPos=4.94, window=0, period=0, id=dzHQ1hyf, mimeType=video/avc, container=video/mp4, bitrate=1890000, codecs=avc1.640029, drm=[playready,unknown (adb41c24-2dbf-4a6d-958b-4457c0d27b95),widevine,cenc], res=720x404, fps=50.0]
downstreamFormat [eventTime=4.86, mediaPos=3.49, window=0, period=0, id=dzEgoQef, mimeType=video/avc, container=video/mp4, bitrate=500000, codecs=avc1.4d4029, drm=[playready,unknown (adb41c24-2dbf-4a6d-958b-4457c0d27b95),widevine,cenc], res=384x216, fps=25.0]
downstreamFormat [eventTime=8.34, mediaPos=4.97, window=0, period=0, id=dzFABhmf, mimeType=video/avc, container=video/mp4, bitrate=1640000, codecs=avc1.4d4029, drm=[playready,unknown (adb41c24-2dbf-4a6d-958b-4457c0d27b95),widevine,cenc], res=704x396, fps=25.0]
downstreamFormat [eventTime=12.33, mediaPos=4.95, window=0, period=0, id=dzHACQ6f, mimeType=video/avc, container=video/mp4, bitrate=920000, codecs=avc1.4d4029, drm=[playready,unknown (adb41c24-2dbf-4a6d-958b-4457c0d27b95),widevine,cenc], res=640x360, fps=25.0]
downstreamFormat [eventTime=14.33, mediaPos=6.95, window=0, period=0, id=dzFABhmf, mimeType=video/avc, container=video/mp4, bitrate=1640000, codecs=avc1.4d4029, drm=[playready,unknown (adb41c24-2dbf-4a6d-958b-4457c0d27b95),widevine,cenc], res=704x396, fps=25.0]
downstreamFormat [eventTime=16.32, mediaPos=4.96, window=0, period=0, id=dzEgoQef, mimeType=video/avc, container=video/mp4, bitrate=500000, codecs=avc1.4d4029, drm=[playready,unknown (adb41c24-2dbf-4a6d-958b-4457c0d27b95),widevine,cenc], res=384x216, fps=25.0]
downstreamFormat [eventTime=20.32, mediaPos=4.95, window=0, period=0, id=dzHQ1hyf, mimeType=video/avc, container=video/mp4, bitrate=1890000, codecs=avc1.640029, drm=[playready,unknown (adb41c24-2dbf-4a6d-958b-4457c0d27b95),widevine,cenc], res=720x404, fps=50.0]
downstreamFormat [eventTime=22.86, mediaPos=5.50, window=0, period=0, id=dzHACQ6f, mimeType=video/avc, container=video/mp4, bitrate=920000, codecs=avc1.4d4029, drm=[playready,unknown (adb41c24-2dbf-4a6d-958b-4457c0d27b95),widevine,cenc], res=640x360, fps=25.0]

But playback seems to continue smoothly.

Are you able to reproduce the issue using my process? If not, what's different with the way you are reproducing it?

zgzong commented 2 months ago

@icbaker We found that issue occurs when player start play with 3145728 bitrate first, then switch to 1890000. If player played 1890000 bitrate first then jump from highest bitrate back to 1890000, then won't reproduce issue.

icbaker commented 2 months ago

Ah right, thanks, with that specific ordering I can reproduce on a Pixel 7a.

@microkatz You can refer to cl/663750371 internally for repro code.