Skip to content

Instantly share code, notes, and snippets.

View prateek54's full-sized avatar
👨‍💻

Prateek Batra prateek54

👨‍💻
View GitHub Profile
@prateek54
prateek54 / build.gradle(:app)
Created November 10, 2024 20:38
Gradle dependencies for media 3 preloading
implementation("androidx.media3:media3-exoplayer:1.4.1")
implementation("androidx.media3:media3-ui:1.4.1")
implementation("androidx.media3:media3-exoplayer-hls:1.4.1")
private fun setupPlayer(
playbackLooper: Looper,
loadControl: LoadControl, // Use same as used in setting up Preload Manager
renderersFactory: RenderersFactory, // Use same as used in setting up Preload Manager
bandwidthMeter: BandwidthMeter, // Use same as used in setting up Preload Manager
) {
player = ExoPlayer.Builder(this)
.setPlaybackLooper(playbackLooper)
.setLoadControl(loadControl)
.setRenderersFactory(renderersFactory)
@prateek54
prateek54 / DefaultPreloadControl.kt
Created November 10, 2024 20:00
Setting up DefaultPreloadControl
@UnstableApi
class DefaultPreloadControl : TargetPreloadStatusControl<Int> {
override fun getTargetPreloadStatus(rankingData: Int): DefaultPreloadManager.Status? {
return DefaultPreloadManager.Status(STAGE_LOADED_TO_POSITION_MS, 500)
}
}
@prateek54
prateek54 / PlayerActivity.kt
Last active November 10, 2024 19:58
Setting up the Preload Manager
fun setupPreloadManager() {
val LOAD_CONTROL_MIN_BUFFER_MS = 5_000
val LOAD_CONTROL_MAX_BUFFER_MS = 20_000
val LOAD_CONTROL_BUFFER_FOR_PLAYBACK_MS = 500
val playbackThread: HandlerThread =
HandlerThread("playback-thread", android.os.Process.THREAD_PRIORITY_AUDIO)
playbackThread.start()
val loadControl = DefaultLoadControl.Builder()
.setBufferDurationsMs(
LOAD_CONTROL_MIN_BUFFER_MS,
@prateek54
prateek54 / build.gradle
Created October 21, 2023 22:14
Dependencies to add Media 3 Transformer
implementation "androidx.media3:media3-transformer:1.1.1"
implementation "androidx.media3:media3-effect:1.1.1"
implementation "androidx.media3:media3-common:1.1.1"
@prateek54
prateek54 / TransformerActivity.kt
Created October 21, 2023 21:00
Function to Convert Video to Grayscale using Media Transaformer
private fun convertToGrayScale() {
val effect = arrayListOf<Effect>()
effect.add(RgbFilter.createGrayscaleFilter())
val transformer = with(Transformer.Builder(this)) {
addListener(object : Transformer.Listener {
override fun onCompleted(composition: Composition, exportResult: ExportResult) {
//Play the video from the path you specified below
}
override fun onError(
@prateek54
prateek54 / TransforVideoMethod.kt
Last active October 24, 2023 15:18
Method to Transform the video
val effect = arrayListOf<Effect>()
effect.add(RgbFilter.createGrayscaleFilter())
effect.add(MatrixTransformationFactory.createZoomInTransition())
effect.add(ScaleAndRotateTransformation.Builder().setRotationDegrees(90F).build())
val transformer = with(Transformer.Builder(this)) {
addListener(object : Transformer.Listener {
override fun onCompleted(composition: Composition, exportResult: ExportResult) {
//Play the video from the path you specified below
}
@prateek54
prateek54 / OfflinePlayerActivity.kt
Created March 24, 2023 20:39
Init Block to play offline downloaded video
ExoPlayer player = ExoPlayer.Builder(this).build()
player?.playWhenReady = true
val mediaSource = downloadTracker?.getDownloadRequest(Uri.parse(VIDEO_URL))!!.let {
DownloadHelper.createMediaSource(
it,
DemoUtil.getDataSourceFactory(this)
)
}
player?.setMediaSource(mediaSource)
player?.prepare()
@prateek54
prateek54 / DownloadTracker.java
Last active March 24, 2023 20:30
Block of code to start/stop offline download
public void toggleDownload(
FragmentManager fragmentManager,
MediaItem mediaItem,
RenderersFactory renderersFactory
) {
Download download = downloads.get(checkNotNull(mediaItem.localConfiguration).uri);
if (download != null && download.state != Download.STATE_FAILED) {
DownloadService.sendRemoveDownload(
/* context= */ context,
/* DownloadService= */ OfflineVideoDownloadService.class,
@prateek54
prateek54 / CustomContract.kt
Created May 21, 2022 18:56
Custom Result Contract Kotlin Class
class CustomContract : ActivityResultContract<String, String?>() {
const val DATA = "data"
const val INPUT_DATA = "input_data"
override fun createIntent(context: Context, input: String?): Intent {
val intent = Intent(context, DummyResultActivity::class.java)
intent.putExtra(INPUT_DATA, input)
return intent
}