RenderHeads / UnityPlugin-AVProVideo

AVPro Video is a multi-platform Unity plugin for advanced video playback
https://www.renderheads.com/products/avpro-video/
224 stars 27 forks source link

Try to cache and play the video, an error occurs on Android. #1856

Closed dw8869 closed 1 month ago

dw8869 commented 1 month ago

Describe the issue Try to cache and play the video, an error occurs on Android.

To Reproduce

  1. Create mediaPlayer
  2. Call mediaPlayer.Cache.AddMediaToCache
  3. Call mediaPlayer.OpenMedia
  4. Call mediaPlayer.Play

Logs avpro_log.txt

2024-05-13 20:05:50.381  8961-9701  ExoPlayerImplInternal   com.skt.treal.jumpvrm                E  Playback error
                                                                                                      com.google.android.exoplr2avp.ExoPlaybackException: Source error
                                                                                                          at com.google.android.exoplr2avp.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:684)
                                                                                                          at com.google.android.exoplr2avp.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:656)
                                                                                                          at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                                          at android.os.Looper.loopOnce(Looper.java:226)
                                                                                                          at android.os.Looper.loop(Looper.java:313)
                                                                                                          at android.os.HandlerThread.run(HandlerThread.java:67)
                                                                                                      Caused by: com.google.android.exoplr2avp.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 416
                                                                                                          at com.google.android.exoplr2avp.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:419)
                                                                                                          at com.google.android.exoplr2avp.upstream.TeeDataSource.open(TeeDataSource.java:60)
                                                                                                          at com.google.android.exoplr2avp.upstream.cache.CacheDataSource.openNextSource(CacheDataSource.java:802)
                                                                                                          at com.google.android.exoplr2avp.upstream.cache.CacheDataSource.read(CacheDataSource.java:657)
                                                                                                          at com.google.android.exoplr2avp.upstream.StatsDataSource.read(StatsDataSource.java:98)
                                                                                                          at com.google.android.exoplr2avp.upstream.DataSourceInputStream.read(DataSourceInputStream.java:86)
                                                                                                          at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:291)
                                                                                                          at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:355)
                                                                                                          at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:181)
                                                                                                          at java.io.InputStreamReader.read(InputStreamReader.java:180)
                                                                                                          at java.io.BufferedReader.fill(BufferedReader.java:172)
                                                                                                          at java.io.BufferedReader.readLine(BufferedReader.java:337)
                                                                                                          at java.io.BufferedReader.readLine(BufferedReader.java:403)
                                                                                                          at com.google.android.exoplr2avp.source.hls.playlist.HlsPlaylistParser$LineIterator.hasNext(HlsPlaylistParser.java:1314)
                                                                                                          at com.google.android.exoplr2avp.source.hls.playlist.HlsPlaylistParser.parseMultivariantPlaylist(HlsPlaylistParser.java:350)
                                                                                                          at com.google.android.exoplr2avp.source.hls.playlist.HlsPlaylistParser.parse(HlsPlaylistParser.java:277)
                                                                                                          at com.google.android.exoplr2avp.source.hls.playlist.HlsPlaylistParser.parse(HlsPlaylistParser.java:75)
                                                                                                          at com.google.android.exoplr2avp.upstream.ParsingLoadable.load(ParsingLoadable.java:181)
                                                                                                          at com.google.android.exoplr2avp.upstream.Loader$LoadTask.run(Loader.java:420)
                                                                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                                                                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
                                                                                                          at java.lang.Thread.run(Thread.java:1012)
                                                                                                      Caused by: com.google.android.exoplr2avp.upstream.DataSourceException
                                                                                                          at com.google.android.exoplr2avp.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:417)
                                                                                                          at com.google.android.exoplr2avp.upstream.TeeDataSource.open(TeeDataSource.java:60) 
                                                                                                          at com.google.android.exoplr2avp.upstream.cache.CacheDataSource.openNextSource(CacheDataSource.java:802) 
                                                                                                          at com.google.android.exoplr2avp.upstream.cache.CacheDataSource.read(CacheDataSource.java:657) 
                                                                                                          at com.google.android.exoplr2avp.upstream.StatsDataSource.read(StatsDataSource.java:98) 
                                                                                                          at com.google.android.exoplr2avp.upstream.DataSourceInputStream.read(DataSourceInputStream.java:86) 
                                                                                                          at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:291) 
                                                                                                          at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:355) 
                                                                                                          at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:181) 
                                                                                                          at java.io.InputStreamReader.read(InputStreamReader.java:180) 
                                                                                                          at java.io.BufferedReader.fill(BufferedReader.java:172) 
                                                                                                          at java.io.BufferedReader.readLine(BufferedReader.java:337) 
                                                                                                          at java.io.BufferedReader.readLine(BufferedReader.java:403) 
                                                                                                          at com.google.android.exoplr2avp.source.hls.playlist.HlsPlaylistParser$LineIterator.hasNext(HlsPlaylistParser.java:1314) 
                                                                                                          at com.google.android.exoplr2avp.source.hls.playlist.HlsPlaylistParser.parseMultivariantPlaylist(HlsPlaylistParser.java:350) 
                                                                                                          at com.google.android.exoplr2avp.source.hls.playlist.HlsPlaylistParser.parse(HlsPlaylistParser.java:277) 
                                                                                                          at com.google.android.exoplr2avp.source.hls.playlist.HlsPlaylistParser.parse(HlsPlaylistParser.java:75) 
                                                                                                          at com.google.android.exoplr2avp.upstream.ParsingLoadable.load(ParsingLoadable.java:181) 
                                                                                                          at com.google.android.exoplr2avp.upstream.Loader$LoadTask.run(Loader.java:420) 
                                                                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
                                                                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) 
                                                                                                          at java.lang.Thread.run(Thread.java:1012) 

Videos https://stg.cms.treal.xyz/output/cd89fa770af8622277fe008afe5bfd31/hls/cd89fa770af8622277fe008afe5bfd31.m3u8

dw8869 commented 1 month ago

Check the cache status before mediaPlay.OpenMedia call, and try mediaPlay.OpenMedia call when the Progress is over 0.

if (status == CachedMediaStatus.Caching)
{
    while (true)
    {
        await Task.Yield();

        mediaPlayer.Cache.GetCachedMediaStatus(URL, ref progress);
        if (progress > 0)
            break;
    }
}

mediaPlayer.OpenMedia(mediaPathType, url, false);

There seems to be no problem when modifying it as above. Can you review my solution?

Chris-RH commented 1 month ago

InvalidResponseCodeException: Response code: 416 suggests that the player is requesting an invalid byte range from the server. While playback whilst caching is possible, it will depend on the available network resources, which may be causing the issue here. I presume it plays fine for you when it is not caching?

dw8869 commented 1 month ago

Not use cache. it works fine.

Chris-RH commented 1 month ago

I would try videos from different servers, and making sure you have a good internet connection.