Last active
September 17, 2019 04:56
-
-
Save CodeK1988/a3612b876f27774a4bd439718121e5d5 to your computer and use it in GitHub Desktop.
ExoPlayer notes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * 播放raw下的本地文件 | |
| */ | |
| fun initPlayer(context: Context, rawRes: Int): SimpleExoPlayer { | |
| val dataSpec = DataSpec(RawResourceDataSource.buildRawResourceUri(rawRes)) | |
| val dataSource = RawResourceDataSource(context) | |
| dataSource.open(dataSpec) | |
| val bandwidthMeter = DefaultBandwidthMeter() | |
| val extractorsFactory = DefaultExtractorsFactory() | |
| val trackSelectionFactory = AdaptiveTrackSelection.Factory(bandwidthMeter) | |
| val trackSelector = DefaultTrackSelector(trackSelectionFactory) | |
| val defaultBandwidthMeter = DefaultBandwidthMeter() | |
| val dataSourceFactory = DefaultDataSourceFactory(context, | |
| Util.getUserAgent(context, context.getString(R.string.app_name)), defaultBandwidthMeter) | |
| val mediaSource = ExtractorMediaSource(dataSource.uri, dataSourceFactory, extractorsFactory, null, null) | |
| val player = ExoPlayerFactory.newSimpleInstance(context, trackSelector) | |
| player.prepare(mediaSource as MediaSource?) | |
| return player | |
| } | |
| /** | |
| * 播放local文件 | |
| */ | |
| fun initPlayer(context: Context, uri: Uri): SimpleExoPlayer { | |
| val dataSpec = DataSpec(uri) | |
| val fileDataSource = FileDataSource() | |
| fileDataSource.open(dataSpec) | |
| val bandwidthMeter = DefaultBandwidthMeter() | |
| val extractorsFactory = DefaultExtractorsFactory() | |
| val trackSelectionFactory = AdaptiveTrackSelection.Factory(bandwidthMeter) | |
| val trackSelector = DefaultTrackSelector(trackSelectionFactory) | |
| val defaultBandwidthMeter = DefaultBandwidthMeter() | |
| val dataSourceFactory = DefaultDataSourceFactory(context, | |
| Util.getUserAgent(context, context.getString(R.string.app_name)), defaultBandwidthMeter) | |
| val mediaSource = ExtractorMediaSource(fileDataSource.uri, dataSourceFactory, extractorsFactory, null, null) | |
| val player = ExoPlayerFactory.newSimpleInstance(context, trackSelector) | |
| player.prepare(mediaSource as MediaSource?) | |
| return player | |
| } | |
| /** | |
| * 在线播放音频 | |
| */ | |
| fun initPlayer(context: Context, url: String?): SimpleExoPlayer? { | |
| LogUtil.e("initPlayer url:$url") | |
| if (url.isNullOrEmpty()) return null | |
| val bandwidthMeter = DefaultBandwidthMeter() | |
| val extractorsFactory = DefaultExtractorsFactory() | |
| val trackSelectionFactory = AdaptiveTrackSelection.Factory(bandwidthMeter) | |
| val trackSelector = DefaultTrackSelector(trackSelectionFactory) | |
| // val defaultBandwidthMeter = DefaultBandwidthMeter() | |
| // val dataSourceFactory = DefaultDataSourceFactory(context, | |
| // Util.getUserAgent(context, context.getString(R.string.app_name)), defaultBandwidthMeter) | |
| //301重定向问题 | |
| val defaultHttpDataSourceFactory = DefaultHttpDataSourceFactory(Util.getUserAgent(context, context.getString(R.string.app_name)), null, DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, | |
| DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS, true) | |
| val mediaSource = ExtractorMediaSource(Uri.parse(url), defaultHttpDataSourceFactory, extractorsFactory, null, null) | |
| val player = ExoPlayerFactory.newSimpleInstance(context, trackSelector) | |
| /*player.setAudioAttributes(AudioAttributes.Builder() | |
| .setUsage(C.USAGE_MEDIA) | |
| .setContentType(C.CONTENT_TYPE_MUSIC) | |
| .build(),true)*/ | |
| player.prepare(mediaSource) | |
| when (player.playbackState) { | |
| Player.STATE_ENDED -> { | |
| player.release() | |
| } | |
| } | |
| return player | |
| } | |
| /** | |
| * 循环播放 mp3 ClippingMediaSource切割不精准 | |
| */ | |
| fun loopPlayer(url: String?, startPositionUs: Long, endPositionUs: Long, listener: Player.EventListener): SimpleExoPlayer? { | |
| LogUtil.e("ListenFragment url:$url startPositionUs:$startPositionUs endPositionUs:$endPositionUs") | |
| exoPlayer?.playWhenReady = false | |
| if (url.isNullOrEmpty()) return null | |
| val defaultHttpDataSourceFactory = DefaultDataSourceFactory(context, | |
| Util.getUserAgent(context, context.getString(R.string.app_name))) | |
| val progressiveMediaSource = ExtractorMediaSource.Factory(defaultHttpDataSourceFactory) | |
| .createMediaSource(Uri.parse(url)) | |
| val clippingMediaSource = ClippingMediaSource(progressiveMediaSource, startPositionUs * 1000, endPositionUs * 1000) | |
| val loopingMediaSource = LoopingMediaSource(clippingMediaSource) | |
| exoPlayer = ExoPlayerFactory.newSimpleInstance(context) | |
| exoPlayer?.prepare(loopingMediaSource) | |
| exoPlayer?.addListener(listener) | |
| return exoPlayer | |
| } | |
| thanks: | |
| https://github.com/google/ExoPlayer/issues/4626 | |
| https://github.com/google/ExoPlayer/issues/4676 | |
| https://stackoverflow.com/questions/54689722/how-to-skip-few-part-of-the-video-in-exoplayer-android | |
| https://github.com/google/ExoPlayer/issues/5501 | |
| https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/source/ClippingMediaSource.html | |
| https://nicedoc.io/google/ExoPlayer/blob/release-v2/RELEASENOTES.md |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment