remove UnknownMediaSourceFactory and infer if transcoding
This commit is contained in:
parent
458a8e2766
commit
fc3de93c3d
2 changed files with 28 additions and 84 deletions
|
|
@ -17,7 +17,7 @@ import com.google.android.exoplayer2.Player.EventListener;
|
|||
import com.google.android.exoplayer2.MediaItem;
|
||||
import com.google.android.exoplayer2.SimpleExoPlayer;
|
||||
import com.google.android.exoplayer2.database.ExoDatabaseProvider;
|
||||
import com.google.android.exoplayer2.source.MediaSourceFactory;
|
||||
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
|
||||
import com.google.android.exoplayer2.upstream.DataSource;
|
||||
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
|
||||
import com.google.android.exoplayer2.upstream.FileDataSource;
|
||||
|
|
@ -25,8 +25,12 @@ import com.google.android.exoplayer2.upstream.cache.CacheDataSink;
|
|||
import com.google.android.exoplayer2.upstream.cache.CacheDataSource;
|
||||
import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor;
|
||||
import com.google.android.exoplayer2.upstream.cache.SimpleCache;
|
||||
import com.google.android.exoplayer2.util.MimeTypes;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class LocalPlayer implements Playback {
|
||||
public static final String TAG = LocalPlayer.class.getSimpleName();
|
||||
|
|
@ -89,14 +93,13 @@ public class LocalPlayer implements Playback {
|
|||
public LocalPlayer(Context context) {
|
||||
this.context = context;
|
||||
|
||||
MediaSourceFactory mediaSourceFactory = new UnknownMediaSourceFactory(buildDataSourceFactory());
|
||||
AudioAttributes audioAttributes = new AudioAttributes.Builder()
|
||||
.setUsage(C.USAGE_MEDIA)
|
||||
.setContentType(C.CONTENT_TYPE_MUSIC)
|
||||
.build();
|
||||
|
||||
exoPlayer = new SimpleExoPlayer.Builder(context)
|
||||
.setMediaSourceFactory(mediaSourceFactory)
|
||||
.setMediaSourceFactory(new DefaultMediaSourceFactory(buildDataSourceFactory()))
|
||||
.setAudioAttributes(audioAttributes, true)
|
||||
.build();
|
||||
|
||||
|
|
@ -141,8 +144,28 @@ public class LocalPlayer implements Playback {
|
|||
uri = Uri.parse(MusicUtil.getTranscodeUri(song));
|
||||
}
|
||||
|
||||
MediaItem mediaItem = MediaItem.fromUri(uri);
|
||||
mediaItem = mediaItem.buildUpon().setMediaId(song.id).build();
|
||||
List<String> containers = PreferenceUtil.getInstance(context).getDirectPlayCodecs().stream()
|
||||
.map(codec -> codec.container.toLowerCase(Locale.ROOT))
|
||||
.collect(Collectors.toList());
|
||||
List<String> codecs = PreferenceUtil.getInstance(context).getDirectPlayCodecs().stream()
|
||||
.map(codec -> codec.codec.toLowerCase(Locale.ROOT))
|
||||
.collect(Collectors.toList());
|
||||
String maxBitrate = PreferenceUtil.getInstance(context).getMaximumBitrate();
|
||||
|
||||
MediaItem mediaItem;
|
||||
|
||||
if (uri.toString().contains("file://") || (containers.contains(song.container.toLowerCase(Locale.ROOT)) && codecs.contains(song.codec.toLowerCase(Locale.ROOT)) && song.bitRate <= Integer.parseInt(maxBitrate))) {
|
||||
mediaItem = new MediaItem.Builder()
|
||||
.setUri(uri)
|
||||
.setMediaId(song.id)
|
||||
.build();
|
||||
} else {
|
||||
mediaItem = new MediaItem.Builder()
|
||||
.setUri(uri)
|
||||
.setMediaId(song.id)
|
||||
.setMimeType(MimeTypes.APPLICATION_M3U8)
|
||||
.build();
|
||||
}
|
||||
|
||||
exoPlayer.addMediaItem(mediaItem);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,79 +0,0 @@
|
|||
package com.dkanada.gramophone.service.playback
|
||||
|
||||
import com.google.android.exoplayer2.MediaItem
|
||||
import com.google.android.exoplayer2.drm.DrmSessionManager
|
||||
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory
|
||||
import com.google.android.exoplayer2.source.MediaSource
|
||||
import com.google.android.exoplayer2.source.MediaSourceFactory
|
||||
import com.google.android.exoplayer2.source.ProgressiveMediaSource
|
||||
import com.google.android.exoplayer2.source.hls.HlsMediaSource
|
||||
import com.google.android.exoplayer2.upstream.*
|
||||
|
||||
import kotlinx.coroutines.*
|
||||
|
||||
import java.net.HttpURLConnection
|
||||
import java.net.URL
|
||||
|
||||
@Suppress("JoinDeclarationAndAssignment")
|
||||
class UnknownMediaSourceFactory(dataSourceFactory: DataSource.Factory) : MediaSourceFactory {
|
||||
private val hlsMediaSource : HlsMediaSource.Factory
|
||||
private val progressiveMediaSource : ProgressiveMediaSource.Factory
|
||||
|
||||
private var loadErrorHandlingPolicy: LoadErrorHandlingPolicy
|
||||
|
||||
override fun setDrmSessionManager(drmSessionManager: DrmSessionManager?): MediaSourceFactory {
|
||||
return this
|
||||
}
|
||||
|
||||
override fun setDrmHttpDataSourceFactory(drmHttpDataSourceFactory: HttpDataSource.Factory?): MediaSourceFactory {
|
||||
return this
|
||||
}
|
||||
|
||||
override fun setDrmUserAgent(drmUserAgent: String?): MediaSourceFactory {
|
||||
return this
|
||||
}
|
||||
|
||||
override fun setLoadErrorHandlingPolicy(loadErrorHandlingPolicy: LoadErrorHandlingPolicy?): MediaSourceFactory {
|
||||
this.loadErrorHandlingPolicy = loadErrorHandlingPolicy!!
|
||||
return this
|
||||
}
|
||||
|
||||
override fun getSupportedTypes(): IntArray {
|
||||
return intArrayOf()
|
||||
}
|
||||
|
||||
override fun createMediaSource(mediaItem: MediaItem): MediaSource {
|
||||
if (mediaItem.playbackProperties?.uri.toString().contains("file://")) {
|
||||
return progressiveMediaSource.createMediaSource(mediaItem)
|
||||
}
|
||||
|
||||
val type: String? = runBlocking {
|
||||
httpGet(mediaItem.playbackProperties!!.uri.toString())
|
||||
}
|
||||
|
||||
val sourceFactory: MediaSourceFactory = if (type == "application/x-mpegURL") {
|
||||
hlsMediaSource
|
||||
} else {
|
||||
progressiveMediaSource
|
||||
}
|
||||
|
||||
return sourceFactory.createMediaSource(mediaItem)
|
||||
}
|
||||
|
||||
@Suppress("BlockingMethodInNonBlockingContext")
|
||||
private suspend fun httpGet(url: String?): String? {
|
||||
return withContext(Dispatchers.IO) {
|
||||
val request = URL(url)
|
||||
val conn = request.openConnection() as HttpURLConnection
|
||||
|
||||
return@withContext conn.getHeaderField("Content-Type")
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
hlsMediaSource = HlsMediaSource.Factory(dataSourceFactory)
|
||||
progressiveMediaSource = ProgressiveMediaSource.Factory(dataSourceFactory, DefaultExtractorsFactory())
|
||||
|
||||
loadErrorHandlingPolicy = DefaultLoadErrorHandlingPolicy()
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue