Skip to content

Instantly share code, notes, and snippets.

@CodeK1988
Last active September 17, 2019 04:56
Show Gist options
  • Select an option

  • Save CodeK1988/a3612b876f27774a4bd439718121e5d5 to your computer and use it in GitHub Desktop.

Select an option

Save CodeK1988/a3612b876f27774a4bd439718121e5d5 to your computer and use it in GitHub Desktop.
ExoPlayer notes
/**
* 播放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