google / ExoPlayer

This project is deprecated and stale. The latest ExoPlayer code is available in https://github.com/androidx/media
https://developer.android.com/media/media3/exoplayer
Apache License 2.0
21.7k stars 6.02k forks source link

Local stream stuck in loading state in ExoPlayer 2.4.0 #2757

Closed needz closed 7 years ago

needz commented 7 years ago

Issue description

When using Demo player in ExoPlayer version 2.4.0 to playback the local stream streamed from Enigma2 Satellite tuner, the player is stuck in loading mode without getting any track information and not switching any further (the tuner itself indicates that there is a stream request going on as it does when it is streaming). The same stream opens fine with Demo player in ExoPlayer version 2.2.0 with all default settings. I also tried version 2.3.1 and it has the same issue as 2.4.0.

I tried playing with various TsExtractor flags, but none of them helped. Then I recorded the same stream to a TS file (see attached link) and it opened just fine (also used FFMpeg extension for AC3 track, but it doesn't solve an issue in case of non-saved stream).

Are there any possible modifications in the code that could lead to this problem in the latest version? Maybe it has something to do with unknown prebuffer or content length? Is there anything I can try to tweak to make it playable as in version 2.2.0? Thanks.

Reproduction steps

Try to open the stream in Demo player in ExoPlayer version 2.4.0 (or 2.3.1)

Link to test content

The link is a local link served from Enigma2 Satellite tuner: http://192.168.0.102:8001/1:0:19:4E89:14:70:1680000:0:0:0: The link to the recorded TS file: https://www.dropbox.com/s/gg1aoal9slfy7av/vlc-output.ts?dl=0

Version of ExoPlayer being used

ExoPlayer 2.4.0

Device(s) and version(s) of Android being used

Nexus Player Nexus 5X

A full bug report captured from the device

ExoPlayer 2.4.0 Log:

05-01 14:38:23.857 29240-29240/com.google.android.exoplayer2.demo I/DefaultRenderersFactory: Loaded LibvpxVideoRenderer.
05-01 14:38:23.892 29240-29240/com.google.android.exoplayer2.demo I/DefaultRenderersFactory: Loaded LibopusAudioRenderer.
05-01 14:38:23.894 29240-29240/com.google.android.exoplayer2.demo I/DefaultRenderersFactory: Loaded LibflacAudioRenderer.
05-01 14:38:23.896 29240-29240/com.google.android.exoplayer2.demo I/DefaultRenderersFactory: Loaded FfmpegAudioRenderer.
05-01 14:38:23.910 29240-29240/com.google.android.exoplayer2.demo I/ExoPlayerImpl: Init ExoPlayerLib/2.4.0 [fugu, Nexus Player, Asus, 25]
05-01 14:38:23.942 29240-29240/com.google.android.exoplayer2.demo D/EventLogger: state [0.00, true, I]
05-01 14:38:23.944 29240-29240/com.google.android.exoplayer2.demo D/Track type: 3
05-01 14:38:23.944 29240-29240/com.google.android.exoplayer2.demo D/Track uri: http://192.168.0.102:8001/1:0:19:4E89:14:70:1680000:0:0:0:
05-01 14:38:24.003 29240-29240/com.google.android.exoplayer2.demo D/EventLogger: state [0.06, true, B]
05-01 14:38:24.006 29240-29240/com.google.android.exoplayer2.demo D/EventLogger: sourceInfo [periodCount=1, windowCount=1
05-01 14:38:24.006 29240-29240/com.google.android.exoplayer2.demo D/EventLogger:   period [?]
05-01 14:38:24.006 29240-29240/com.google.android.exoplayer2.demo D/EventLogger:   window [?, false, false]
05-01 14:38:24.006 29240-29240/com.google.android.exoplayer2.demo D/EventLogger: ]
05-01 14:38:24.045 29240-29423/com.google.android.exoplayer2.demo D/NetworkSecurityConfig: No Network Security Config specified, using platform default
05-01 14:38:24.082 29240-29240/com.google.android.exoplayer2.demo D/EventLogger: loading [true]
05-01 14:38:24.135 29240-29282/com.google.android.exoplayer2.demo D/OpenGLRenderer: endAllActiveAnimators on 0xdd077880 (ExpandableListView) with handle 0xceff0940
05-01 14:38:25.846 29240-29245/com.google.android.exoplayer2.demo I/art: Do partial code cache collection, code=30KB, data=18KB
05-01 14:38:25.847 29240-29245/com.google.android.exoplayer2.demo I/art: After code cache collection, code=30KB, data=18KB
05-01 14:38:25.847 29240-29245/com.google.android.exoplayer2.demo I/art: Increasing code cache capacity to 128KB
05-01 14:38:30.816 29240-29245/com.google.android.exoplayer2.demo I/art: Do partial code cache collection, code=61KB, data=38KB
05-01 14:38:30.817 29240-29245/com.google.android.exoplayer2.demo I/art: After code cache collection, code=61KB, data=38KB
05-01 14:38:30.817 29240-29245/com.google.android.exoplayer2.demo I/art: Increasing code cache capacity to 256KB
05-01 14:38:53.614 29240-29251/com.google.android.exoplayer2.demo I/art: Background partial concurrent mark sweep GC freed 32(72KB) AllocSpace objects, 0(0B) LOS objects, 37% free, 26MB/42MB, paused 7.315ms total 22.118ms
05-01 14:39:55.171 29240-29247/com.google.android.exoplayer2.demo W/art: Suspending all threads took: 18.896ms

ExoPlayer 2.2.0 Log:

05-01 13:36:33.431 588-588/com.google.android.exoplayer2.demo I/SimpleExoPlayer: Loaded LibvpxVideoRenderer.
05-01 13:36:33.457 588-588/com.google.android.exoplayer2.demo I/SimpleExoPlayer: Loaded LibopusAudioRenderer.
05-01 13:36:33.459 588-588/com.google.android.exoplayer2.demo I/SimpleExoPlayer: Loaded LibflacAudioRenderer.
05-01 13:36:33.461 588-588/com.google.android.exoplayer2.demo I/SimpleExoPlayer: Loaded FfmpegAudioRenderer.
05-01 13:36:33.474 588-588/com.google.android.exoplayer2.demo I/ExoPlayerImpl: Init 2.2.0 [fugu, Nexus Player, Asus, 25]
05-01 13:36:33.502 588-588/com.google.android.exoplayer2.demo D/EventLogger: state [0.00, true, I]
05-01 14:38:23.589 588-588/com.google.android.exoplayer2.demo D/Track type: 3
05-01 14:38:23.589 588-588/com.google.android.exoplayer2.demo D/Track uri: http://192.168.0.102:8001/1:0:19:4E89:14:70:1680000:0:0:0:
05-01 13:36:33.589 588-588/com.google.android.exoplayer2.demo D/EventLogger: state [0.09, true, B]
05-01 13:36:33.590 588-588/com.google.android.exoplayer2.demo D/EventLogger: sourceInfo [periodCount=1, windowCount=1
05-01 13:36:33.590 588-588/com.google.android.exoplayer2.demo D/EventLogger:   period [?]
05-01 13:36:33.590 588-588/com.google.android.exoplayer2.demo D/EventLogger:   window [?, false, false]
05-01 13:36:33.590 588-588/com.google.android.exoplayer2.demo D/EventLogger: ]
05-01 13:36:33.616 588-922/com.google.android.exoplayer2.demo D/NetworkSecurityConfig: No Network Security Config specified, using platform default
05-01 13:36:33.670 588-588/com.google.android.exoplayer2.demo D/EventLogger: loading [true]
05-01 13:36:33.750 588-607/com.google.android.exoplayer2.demo D/OpenGLRenderer: endAllActiveAnimators on 0xdd04b880 (ExpandableListView) with handle 0xce970790
05-01 13:36:34.883 588-922/com.google.android.exoplayer2.demo W/PesReader: Unexpected start code prefix: 5731496
05-01 13:36:34.887 588-922/com.google.android.exoplayer2.demo W/PesReader: Unexpected start code prefix: 14985059
05-01 13:36:34.888 588-922/com.google.android.exoplayer2.demo W/PesReader: Unexpected start code prefix: 5157057
05-01 13:36:34.892 588-922/com.google.android.exoplayer2.demo W/PesReader: Unexpected start code prefix: 7545731
05-01 13:36:34.892 588-922/com.google.android.exoplayer2.demo W/PesReader: Unexpected start code prefix: 140114
05-01 13:36:34.895 588-922/com.google.android.exoplayer2.demo W/PesReader: Unexpected start code prefix: 3165648
05-01 13:36:34.900 588-922/com.google.android.exoplayer2.demo W/PesReader: Unexpected start code prefix: 12268500
05-01 13:36:34.902 588-922/com.google.android.exoplayer2.demo W/PesReader: Unexpected start code prefix: 4300057
05-01 13:36:34.937 588-594/com.google.android.exoplayer2.demo I/art: Do partial code cache collection, code=30KB, data=18KB
05-01 13:36:34.937 588-594/com.google.android.exoplayer2.demo I/art: After code cache collection, code=30KB, data=18KB
05-01 13:36:34.937 588-594/com.google.android.exoplayer2.demo I/art: Increasing code cache capacity to 128KB
05-01 13:36:35.199 588-588/com.google.android.exoplayer2.demo D/EventLogger: sourceInfo [periodCount=1, windowCount=1
05-01 13:36:35.199 588-588/com.google.android.exoplayer2.demo D/EventLogger:   period [?]
05-01 13:36:35.199 588-588/com.google.android.exoplayer2.demo D/EventLogger:   window [?, false, false]
05-01 13:36:35.200 588-588/com.google.android.exoplayer2.demo D/EventLogger: ]
05-01 13:36:35.285 588-912/com.google.android.exoplayer2.demo W/VideoCapabilities: Unrecognized profile/level 0/0 for video/mpeg2
05-01 13:36:35.285 588-912/com.google.android.exoplayer2.demo W/VideoCapabilities: Unrecognized profile/level 0/2 for video/mpeg2
05-01 13:36:35.285 588-912/com.google.android.exoplayer2.demo W/VideoCapabilities: Unrecognized profile/level 0/3 for video/mpeg2
05-01 13:36:35.315 588-912/com.google.android.exoplayer2.demo I/VideoCapabilities: Unsupported profile 4 for video/mp4v-es
05-01 13:36:35.329 588-912/com.google.android.exoplayer2.demo E/linker: library "/system/lib/libopus.so" ("/system/lib/libopus.so") needed or dlopened by "/system/lib/libnativeloader.so" is not accessible for the namespace: [name="classloader-namespace", ld_library_paths="", default_library_paths="/data/app/com.google.android.exoplayer2.demo-1/lib/x86:/data/app/com.google.android.exoplayer2.demo-1/base.apk!/lib/x86:/data/app/com.google.android.exoplayer2.demo-1/split_lib_dependencies_apk.apk!/lib/x86:/data/app/com.google.android.exoplayer2.demo-1/split_lib_slice_0_apk.apk!/lib/x86:/data/app/com.google.android.exoplayer2.demo-1/split_lib_slice_1_apk.apk!/lib/x86:/data/app/com.google.android.exoplayer2.demo-1/split_lib_slice_2_apk.apk!/lib/x86:/data/app/com.google.android.exoplayer2.demo-1/split_lib_slice_3_apk.apk!/lib/x86:/data/app/com.google.android.exoplayer2.demo-1/split_lib_slice_4_apk.apk!/lib/x86:/data/app/com.google.android.exoplayer2.demo-1/split_lib_slice_5_apk.apk!/lib/x86:/data/app/com.google.android.exoplayer2.demo-1/split_lib_slice_6_apk.apk!/lib/x86:/data/app/com.g
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger: Tracks [
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger:   Renderer:1 [
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger:     Group:0, adaptive_supported=N/A [
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger:       [X] Track:0, id=null, mimeType=video/avc, res=1920x1080, supported=YES
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger:     ]
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger:   ]
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger:   Renderer:4 [
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger:     Group:0, adaptive_supported=N/A [
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger:       [X] Track:0, id=null, mimeType=audio/mpeg-L2, channels=2, sample_rate=48000, language=rus, supported=YES
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger:     ]
05-01 13:36:35.349 588-588/com.google.android.exoplayer2.demo D/EventLogger:     Group:1, adaptive_supported=N/A [
05-01 13:36:35.350 588-588/com.google.android.exoplayer2.demo D/EventLogger:       [ ] Track:0, id=null, mimeType=audio/ac3, channels=6, sample_rate=48000, language=rus, supported=YES
05-01 13:36:35.350 588-588/com.google.android.exoplayer2.demo D/EventLogger:     ]
05-01 13:36:35.350 588-588/com.google.android.exoplayer2.demo D/EventLogger:   ]
05-01 13:36:35.350 588-588/com.google.android.exoplayer2.demo D/EventLogger:   Renderer:6 [
05-01 13:36:35.350 588-588/com.google.android.exoplayer2.demo D/EventLogger:     Group:0, adaptive_supported=N/A [
05-01 13:36:35.350 588-588/com.google.android.exoplayer2.demo D/EventLogger:       [ ] Track:0, id=null, mimeType=application/cea-608, supported=YES
05-01 13:36:35.350 588-588/com.google.android.exoplayer2.demo D/EventLogger:     ]
05-01 13:36:35.350 588-588/com.google.android.exoplayer2.demo D/EventLogger:   ]
05-01 13:36:35.350 588-588/com.google.android.exoplayer2.demo D/EventLogger: ]
05-01 13:36:35.351 588-1031/com.google.android.exoplayer2.demo I/OMXClient: MuxOMX ctor
05-01 13:36:35.362 588-1030/com.google.android.exoplayer2.demo I/MediaCodec: [OMX.Intel.VideoDecoder.AVC] setting surface generation to 602113
05-01 13:36:35.363 588-588/com.google.android.exoplayer2.demo D/EventLogger: videoEnabled [1.87]
05-01 13:36:35.364 588-588/com.google.android.exoplayer2.demo D/EventLogger: audioEnabled [1.87]
05-01 13:36:35.382 588-1031/com.google.android.exoplayer2.demo D/SurfaceUtils: set up nativeWindow 0xce940808 for 1920x1080, color 0x7fa00f00, rotation 0, usage 0x2922
05-01 13:36:35.388 588-588/com.google.android.exoplayer2.demo D/EventLogger: videoDecoderInitialized [1.89, OMX.Intel.VideoDecoder.AVC]
05-01 13:36:35.388 588-588/com.google.android.exoplayer2.demo D/EventLogger: videoFormatChanged [1.89, id=null, mimeType=video/avc, res=1920x1080]
05-01 13:36:35.408 588-588/com.google.android.exoplayer2.demo D/EventLogger: audioDecoderInitialized [1.91, ffmpegLavc57.91.100-mp3]
05-01 13:36:35.408 588-588/com.google.android.exoplayer2.demo D/EventLogger: audioFormatChanged [1.91, id=null, mimeType=audio/mpeg-L2, channels=2, sample_rate=48000, language=rus]
05-01 13:36:35.442 588-912/com.google.android.exoplayer2.demo D/AudioTrack: Client defaulted notificationFrames to 6156 for frameCount 12312
05-01 13:36:35.444 588-588/com.google.android.exoplayer2.demo D/EventLogger: audioSessionId [2305]
05-01 13:36:37.323 588-588/com.google.android.exoplayer2.demo D/EventLogger: state [3.83, true, R]
05-01 13:36:39.198 588-594/com.google.android.exoplayer2.demo I/art: Do partial code cache collection, code=61KB, data=43KB
05-01 13:36:39.199 588-594/com.google.android.exoplayer2.demo I/art: After code cache collection, code=61KB, data=43KB
05-01 13:36:39.199 588-594/com.google.android.exoplayer2.demo I/art: Increasing code cache capacity to 256KB
05-01 13:36:49.355 588-594/com.google.android.exoplayer2.demo I/art: Do full code cache collection, code=124KB, data=77KB
05-01 13:36:49.356 588-594/com.google.android.exoplayer2.demo I/art: Starting a blocking GC JitCodeCache
05-01 13:36:49.356 588-594/com.google.android.exoplayer2.demo I/art: After code cache collection, code=109KB, data=62KB
05-01 13:37:12.720 588-594/com.google.android.exoplayer2.demo I/art: Do partial code cache collection, code=123KB, data=70KB
05-01 13:37:12.720 588-594/com.google.android.exoplayer2.demo I/art: After code cache collection, code=123KB, data=70KB
05-01 13:37:12.720 588-594/com.google.android.exoplayer2.demo I/art: Increasing code cache capacity to 512KB
needz commented 7 years ago

@AquilesCanta, please let me know if you want me to set up an outside stream, so you can try to reproduce this issue on your end. Please suggest the best time and way to do it. Thanks.

AquilesCanta commented 7 years ago

I have just checked out r2.4.0 from github and successfully played the TS fragment from dropbox. Are you sure you are using that same file? Surely irrelevant, but FLAG_ALLOW_NON_IDR_FRAMES for the video to show. Can you provide a TS fragment that reproduces the issue? The live stream might make it much harder for me to reproduce.

needz commented 7 years ago

That's the problem exactly. TS plays just fine on my side too, but the Live stream doesn't even start (where there is no such problem in version 2.2.0). Enigma2 doesn't send chunks of TS's, but it's just a continuous stream. Seems like ExoPlayer is unable to determine the length of the stream or something along these lines. The flag is set, it's not a problem.

I could share the live stream, so you can try to do it. Just let me know where to send it (privately) and appropriate time, when you can check it, since I will have to put it into standby mode for that period.

AquilesCanta commented 7 years ago

Can you send it to dev.exoplayer@gmail.com now? I have a few minutes to check it out.

AquilesCanta commented 7 years ago

Thanks for the stream. You should use MODE_SINGLE_PMT (mode argument in the TsExtractor constructor). What's going on is that the PAT of your stream is declaring more PMTs than actually exist, so ExoPlayer gets stuck waiting for them, not allowing preparation to finish. I'll make it the default mode for the next push.

needz commented 7 years ago

Wow, thanks, I can confirm it's working with MODE_SINGLE_PMT. Maybe it could also be added as DefaultTsPayloadReaderFactory flag.

AquilesCanta commented 7 years ago

We'll be adding a convenience method to DefaultExtractorsFactory. However, we cannot change the fact that it is a extractor mode.