ExoPayer 研究、集成

參考:

ExoPlayer Home
ExoPlayer library
HLS playback in ExoPlayer
ExoPlayer 2 - MediaSource composition
Customizing ExoPlayer’s UI components

使用Android.mk文件導入Exoplayer包
ExoPlayer淺析
Google Exoplayer 之全面認識

Consider allowing seeking before renderers prepared #385

 

備註1:

04-13 21:22:29.978 1723 1828 W DebugLog: ExoMediaPlayer: onPlayerError 
04-13 21:22:29.978 1723 1828 W DebugLog: com.google.android.exoplayer2.ExoPlaybackException 
04-13 21:22:29.978 1723 1828 W DebugLog: at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:353) 
04-13 21:22:29.978 1723 1828 W DebugLog: at android.os.Handler.dispatchMessage(Handler.java:98) 
04-13 21:22:29.978 1723 1828 W DebugLog: at android.os.Looper.loop(Looper.java:136) 
04-13 21:22:29.978 1723 1828 W DebugLog: at android.os.HandlerThread.run(HandlerThread.java:61) 
04-13 21:22:29.978 1723 1828 W DebugLog: Caused by: com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor) could read the stream. 
04-13 21:22:29.978 1723 1828 W DebugLog: at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractorHolder.selectExtractor(ExtractorMediaPeriod.java:924) 
04-13 21:22:29.978 1723 1828 W DebugLog: at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:846) 
04-13 21:22:29.978 1723 1828 W DebugLog: at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:308) 
04-13 21:22:29.978 1723 1828 W DebugLog: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
04-13 21:22:29.978 1723 1828 W DebugLog: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
04-13 21:22:29.978 1723 1828 W DebugLog: at java.lang.Thread.run(Thread.java:841) 
04-13 21:22:29.998 1723 1828 D MediaExtendPlayer: onError: what=0, extra=0 

備註2:

調整display尺寸,會再次觸發 onVideoSizeChanged、onRenderedFirstFrame 

04-14 07:48:12.988 28648 28782 D MediaExtendPlayer: setMediaDisplay 
04-14 07:48:12.998 28648 28782 D MediaProgramPlayer: InitializedState: MSG_UPDATE_SURFACE: set surface 
04-14 07:48:12.998 28648 28782 V TaskPlayer: [000001|test:///1] onInfoUpdated: prop=RECTANGLE 
04-14 07:48:12.998 28648 28782 D TaskPlayer: [000001|test:///1] notifyListener: onEvent: what=INFO_CHANGED, extra=17 
04-14 07:48:12.998 28648 28648 D TvService: onLayoutChange 
04-14 07:48:12.998 28648 28648 D TvService: onLayoutChange updated 
04-14 07:48:13.008 28648 28671 D TvService: setInputPosition 
04-14 07:48:13.008 28648 28782 D ExoMediaPlayer: onVideoSizeChanged 
04-14 07:48:13.008 28648 28782 D MediaExtendPlayer: onVideoSizeChanged: width=640, height=400 
04-14 07:48:13.008 28648 28782 D ExoMediaPlayer: onRenderedFirstFrame 
04-14 07:48:13.018 28648 28782 D MediaExtendPlayer: onInfo: what=3, extra=0 
04-14 07:48:13.018 28648 28782 D MediaExtendPlayer: onVideoSizeChanged: width=640, height=400 
04-14 07:48:13.028 28648 28782 D MediaExtendPlayer: onReady: extra=0 
04-14 07:48:13.458 28648 28648 D TvService: onLayoutChange 

備註3:

preseek 沒有效果 

04-14 07:48:11.468 28648 28782 D TaskPlayer: [000001|test:///1] notifyListener: onStatusChange: PLAYING/0/PREPARED:85[45975][0%][Ready][Seeking] 
04-14 07:48:11.468 28648 28782 V MediaProgramPlayer: StartedState enter 
04-14 07:48:11.478 28648 28782 D MediaExtendPlayer: start 
04-14 07:48:11.488 28648 28782 D ExoMediaPlayer: start 
04-14 07:48:11.498 28648 28782 D ExoMediaPlayer: onPlayerStateChanged true, 3 
04-14 07:48:11.508 28648 28782 D MediaExtendPlayer: onInfo: what=702, extra=0 
04-14 07:48:11.548 28648 28782 V TaskPlayer: [000001|test:///1] onStateChangeTo: state=STARTED 
04-14 07:48:11.558 28648 28782 D TaskPlayer: [000001|test:///1] notifyListener: onStatusChange: PLAYING/0/STARTED:85[45975][0%][Ready][Seeking] 
04-14 07:48:11.568 28648 28782 V TaskPlayer: [000001|test:///1] onEvent: what=5, extra=154 
04-14 07:48:11.568 28648 28782 D TaskPlayer: [000001|test:///1] notifyListener: onEvent: what=SEEKING_END, extra=154 
04-14 07:48:11.598 28648 28782 D TaskPlayer: [000001|test:///1] notifyListener: onStatusChange: PLAYING/0/STARTED:17[165][0%][Ready] 

備註4:

joint hls 失敗 

04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: onPlayerError 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: com.google.android.exoplayer2.ExoPlaybackException 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:353) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at android.os.Handler.dispatchMessage(Handler.java:98) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at android.os.Looper.loop(Looper.java:136) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at android.os.HandlerThread.run(HandlerThread.java:61) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: Caused by: java.io.EOFException 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at com.google.android.exoplayer2.extractor.DefaultExtractorInput.readFromDataSource(DefaultExtractorInput.java:265) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at com.google.android.exoplayer2.extractor.DefaultExtractorInput.skipFully(DefaultExtractorInput.java:102) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at com.google.android.exoplayer2.extractor.DefaultExtractorInput.skipFully(DefaultExtractorInput.java:110) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor.readAtomPayload(FragmentedMp4Extractor.java:417) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor.read(FragmentedMp4Extractor.java:305) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at com.google.android.exoplayer2.source.hls.HlsMediaChunk.loadMedia(HlsMediaChunk.java:285) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at com.google.android.exoplayer2.source.hls.HlsMediaChunk.load(HlsMediaChunk.java:219) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:308) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
04-15 07:54:19.618 6825 6825 W ExoMediaPlayer: at java.lang.Thread.run(Thread.java:841) 

備註5:

04-15 08:08:20.048 6825 26840 E LoadTask: Unexpected exception loading stream 
04-15 08:08:20.048 6825 26840 E LoadTask: java.lang.NullPointerException 
04-15 08:08:20.048 6825 26840 E LoadTask: at com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor.onMoovContainerAtomRead(FragmentedMp4Extractor.java:462) 
04-15 08:08:20.048 6825 26840 E LoadTask: at com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor.onContainerAtomRead(FragmentedMp4Extractor.java:444) 
04-15 08:08:20.048 6825 26840 E LoadTask: at com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor.processAtomEnded(FragmentedMp4Extractor.java:424) 
04-15 08:08:20.048 6825 26840 E LoadTask: at com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor.readAtomPayload(FragmentedMp4Extractor.java:419) 
04-15 08:08:20.048 6825 26840 E LoadTask: at com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor.read(FragmentedMp4Extractor.java:305) 
04-15 08:08:20.048 6825 26840 E LoadTask: at com.google.android.exoplayer2.source.hls.HlsMediaChunk.loadMedia(HlsMediaChunk.java:285) 
04-15 08:08:20.048 6825 26840 E LoadTask: at com.google.android.exoplayer2.source.hls.HlsMediaChunk.load(HlsMediaChunk.java:219) 
04-15 08:08:20.048 6825 26840 E LoadTask: at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:308) 
04-15 08:08:20.048 6825 26840 E LoadTask: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
04-15 08:08:20.048 6825 26840 E LoadTask: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
04-15 08:08:20.048 6825 26840 E LoadTask: at java.lang.Thread.run(Thread.java:841) 

備註6:

因爲沒有 mvex atom 

    // Read declaration of track fragments in the Moov box. 
    ContainerAtom mvex = moov.getContainerAtomOfType(Atom.TYPE_mvex); 
    SparseArray<DefaultSampleValues> defaultSampleValuesArray = new SparseArray<>(); 
    long duration = C.TIME_UNSET; 
    int mvexChildrenSize = mvex.leafChildren.size(); 
    for (int i = 0; i < mvexChildrenSize; i++) { 
      Atom.LeafAtom atom = mvex.leafChildren.get(i); 
      if (atom.type == Atom.TYPE_trex) { 
        Pair<Integer, DefaultSampleValues> trexData = parseTrex(atom.data); 
        defaultSampleValuesArray.put(trexData.first, trexData.second); 
      } else if (atom.type == Atom.TYPE_mehd) { 
        duration = parseMehd(atom.data); 
      } 
    } 

備註7:

廣告連接,節目時間不累加 

04-15 09:59:24.088 11861 11930 D ExoMediaPlayer: onPlayerStateChanged true, 3 
04-15 09:59:24.088 11861 11861 D ExoMediaPlayer: onLoadingChanged true 
04-15 09:59:24.098 11861 11861 D ExoMediaPlayer: onTimelineChanged com.google.android.exoplayer2.source.ConcatenatingMediaSource$ConcatenatedTimeline@4294be88 
04-15 09:59:24.098 11861 11930 D MediaExtendPlayer: onInfo: what=702, extra=0 
04-15 09:59:24.108 11861 11930 V TaskPlayer: [000003|/data/media/ads] onStateChangeTo: state=STARTED 
04-15 09:59:24.108 11861 11930 D TaskPlayer: [000003|/data/media/ads] notifyListener: onStatusChange: PLAYING/0/STARTED:17[0][0%][Ready] 
04-15 09:59:24.108 11861 11861 D ExoMediaPlayer: onLoadingChanged false 
04-15 09:59:24.388 11861 11861 D TvService: onLayoutChange 
04-15 09:59:39.138 11861 11861 D ExoMediaPlayer: onPositionDiscontinuity 0 -------- 節目切換 
04-15 09:59:39.138 11861 11861 D ExoMediaPlayer: onTracksChanged com.google.android.exoplayer2.source.TrackGroupArray@12db0a8c 
04-15 09:59:54.158 11861 11861 D ExoMediaPlayer: onPlayerStateChanged true, 4 
04-15 09:59:54.168 11861 11861 D MediaExtendPlayer: onCompletion 
04-15 09:59:54.168 11861 11930 V TaskPlayer: [000003|/data/media/ads] onStateChangeTo: state=COMPLETED 
04-15 09:59:54.168 11861 11930 D TaskPlayer: [000003|/data/media/ads] notifyListener: onStatusChange: PLAYING/0/COMPLETED:17[15145][0%][Ready] ----- 第二個節目結束時間 15145 
04-15 09:59:54.178 11861 11930 V MediaProgramPlayer: CompletedState enter 
04-15 09:59:54.178 11861 11930 V TaskPlayer: [000003|/data/media/ads] onStateChangeTo: state=COMPLETED

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章