Skip to content

Commit 04f0ecb

Browse files
author
Aman Choudhary
committed
Added snippets for Migration guide as well.
1 parent c03b1ba commit 04f0ecb

File tree

2 files changed

+170
-22
lines changed

2 files changed

+170
-22
lines changed

misc/src/main/java/com/example/snippets/InspectorModuleJavaSnippets.java

Lines changed: 82 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,21 @@
1616

1717
package com.example.snippets;
1818

19+
import static android.media.MediaMetadataRetriever.METADATA_KEY_MIMETYPE;
20+
import static android.media.MediaMetadataRetriever.OPTION_CLOSEST;
21+
1922
import android.content.Context;
23+
import android.graphics.Bitmap;
2024
import android.media.MediaFormat;
25+
import android.media.MediaMetadataRetriever;
2126
import android.util.Log;
2227

2328
import androidx.annotation.NonNull;
2429
import androidx.annotation.OptIn;
30+
import androidx.media3.common.Format;
2531
import androidx.media3.common.MediaItem;
2632
import androidx.media3.common.Timeline;
33+
import androidx.media3.common.TrackGroup;
2734
import androidx.media3.common.util.UnstableApi;
2835
import androidx.media3.exoplayer.MediaExtractorCompat;
2936
import androidx.media3.exoplayer.source.TrackGroupArray;
@@ -47,12 +54,12 @@
4754
public class InspectorModuleJavaSnippets {
4855
private final String TAG = "InspectorModuleLog";
4956

50-
// [START android_media3_inspector_MetadataRetriever_java]
57+
// [START android_dev_retriever_media3_java]
5158
public void retrieveMetadata(Context context, MediaItem mediaItem) {
52-
try (MetadataRetriever metadataRetriever = new MetadataRetriever.Builder(context, mediaItem).build()) {
53-
ListenableFuture<TrackGroupArray> trackGroupsFuture = metadataRetriever.retrieveTrackGroups();
54-
ListenableFuture<Timeline> timelineFuture = metadataRetriever.retrieveTimeline();
55-
ListenableFuture<Long> durationUsFuture = metadataRetriever.retrieveDurationUs();
59+
try (MetadataRetriever retriever = new MetadataRetriever.Builder(context, mediaItem).build()) {
60+
ListenableFuture<TrackGroupArray> trackGroupsFuture = retriever.retrieveTrackGroups();
61+
ListenableFuture<Timeline> timelineFuture = retriever.retrieveTimeline();
62+
ListenableFuture<Long> durationUsFuture = retriever.retrieveDurationUs();
5663

5764
ListenableFuture<List<Object>> allFutures = Futures.allAsList(trackGroupsFuture, timelineFuture, durationUsFuture);
5865
Executor executor = Executors.newSingleThreadExecutor();
@@ -62,7 +69,8 @@ public void onSuccess(List<Object> result) {
6269
handleMetadata(
6370
Futures.getUnchecked(trackGroupsFuture),
6471
Futures.getUnchecked(timelineFuture),
65-
Futures.getUnchecked(durationUsFuture));
72+
Futures.getUnchecked(durationUsFuture)
73+
);
6674
}
6775

6876
@Override
@@ -72,19 +80,61 @@ public void onFailure(@NonNull Throwable t) {
7280
}, executor);
7381
}
7482
}
75-
// [END android_media3_inspector_MetadataRetriever_java]
83+
// [END android_dev_retriever_media3_java]
84+
85+
// [START android_migration_retriever_platform_java]
86+
public void retrieveMetadataPlatform(String mediaPath) {
87+
try (MediaMetadataRetriever retriever = new MediaMetadataRetriever()) {
88+
retriever.setDataSource(mediaPath);
89+
String mimeType = retriever.extractMetadata(METADATA_KEY_MIMETYPE);
90+
Log.d(TAG, "MIME type: " + mimeType);
91+
retriever.release();
92+
} catch (Exception e) {
93+
throw new RuntimeException(e);
94+
}
95+
}
96+
// [END android_migration_retriever_platform_java]
97+
98+
// [START android_migration_retriever_media3_java]
99+
public void retrieveMetadataMedia3(Context context, MediaItem mediaItem) {
100+
try (MetadataRetriever retriever = new MetadataRetriever.Builder(context, mediaItem).build()) {
101+
ListenableFuture<TrackGroupArray> trackGroupsFuture = retriever.retrieveTrackGroups();
76102

77-
// [START android_media3_inspector_FrameExtractor_java]
103+
Executor executor = Executors.newSingleThreadExecutor();
104+
Futures.addCallback(trackGroupsFuture, new FutureCallback<Object>() {
105+
@Override
106+
public void onSuccess(Object trackGroupsObject) {
107+
TrackGroupArray trackGroups = (TrackGroupArray) trackGroupsObject;
108+
for (int i = 0; i < trackGroups.length; i++) {
109+
TrackGroup trackGroup = trackGroups.get(i);
110+
for (int j = 0; j < trackGroup.length; j++) {
111+
Format format = trackGroup.getFormat(j);
112+
String mimeType = format.containerMimeType;
113+
Log.d(TAG, "MIME type: " + mimeType);
114+
}
115+
}
116+
}
117+
118+
@Override
119+
public void onFailure(@NonNull Throwable t) {
120+
Log.e(TAG, "Error retrieving metadata: " + t.getMessage());
121+
}
122+
}, executor);
123+
}
124+
}
125+
// [END android_migration_retriever_media3_java]
126+
127+
// [START android_dev_frame_media3_java]
78128
public void extractFrame(Context context, MediaItem mediaItem) {
79129
try (FrameExtractor frameExtractor = new FrameExtractor.Builder(context, mediaItem).build()) {
80130
ListenableFuture<FrameExtractor.Frame> frameFuture = frameExtractor.getFrame(5000L);
81131

82132
Executor executor = Executors.newSingleThreadExecutor();
83133
Futures.addCallback(frameFuture, new FutureCallback<Object>() {
84-
@OptIn(markerClass = UnstableApi.class)
85134
@Override
86-
public void onSuccess(Object result) {
87-
long presentationTimeMs = Futures.getUnchecked(frameFuture).presentationTimeMs;
135+
public void onSuccess(Object frameObject) {
136+
FrameExtractor.Frame frame = (FrameExtractor.Frame) frameObject;
137+
long presentationTimeMs = frame.presentationTimeMs;
88138
Log.d(TAG, "Extracted frame at " + presentationTimeMs);
89139
}
90140

@@ -95,9 +145,25 @@ public void onFailure(@NonNull Throwable t) {
95145
}, executor);
96146
}
97147
}
98-
// [END android_media3_inspector_FrameExtractor_java]
148+
// [END android_dev_frame_media3_java]
149+
150+
// [START android_migration_frame_platform_java]
151+
public Bitmap extractFramePlatform(String mediaPath, Long frameTimeMs) {
152+
Bitmap bitmap;
153+
try (MediaMetadataRetriever retriever = new MediaMetadataRetriever()) {
154+
retriever.setDataSource(mediaPath);
155+
bitmap = retriever.getFrameAtTime(frameTimeMs * 1000L, // Time is in microseconds
156+
OPTION_CLOSEST);
157+
Log.d(TAG, "Extracted frame " + bitmap);
158+
retriever.release();
159+
} catch (Exception e) {
160+
throw new RuntimeException(e);
161+
}
162+
return bitmap;
163+
}
164+
// [END android_migration_frame_platform_java]
99165

100-
// [START android_media3_inspector_MediaExtractorCompat_java]
166+
// [START android_dev_extractor_media3_java]
101167
public void extractSamples(Context context, String mediaPath) {
102168
MediaExtractorCompat extractor = new MediaExtractorCompat(context);
103169
try {
@@ -127,10 +193,11 @@ public void extractSamples(Context context, String mediaPath) {
127193
} catch (IOException e) {
128194
throw new RuntimeException(e);
129195
} finally {
130-
extractor.release(); // 3. Release the extractor
196+
// 3. Release the extractor
197+
extractor.release();
131198
}
132199
}
133-
// [END android_media3_inspector_MediaExtractorCompat_java]
200+
// [END android_dev_extractor_media3_java]
134201

135202
private void handleMetadata(TrackGroupArray trackGroups, Timeline timeline, Long durationUs) {
136203
Log.d(TAG, "TrackGroups: " + trackGroups);

misc/src/main/java/com/example/snippets/InspectorModuleKotlinSnippets.kt

Lines changed: 88 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ package com.example.snippets
1818

1919
import android.content.Context
2020
import android.graphics.Bitmap
21+
import android.media.MediaMetadataRetriever
22+
import android.media.MediaMetadataRetriever.METADATA_KEY_MIMETYPE
23+
import android.media.MediaMetadataRetriever.OPTION_CLOSEST
2124
import android.util.Log
2225
import androidx.annotation.OptIn
2326
import androidx.media3.common.MediaItem
@@ -37,7 +40,7 @@ const val TAG = "InspectorModuleLog"
3740
@OptIn(UnstableApi::class)
3841
class InspectorModuleKotlinSnippets {
3942

40-
// [START android_media3_inspector_MetadataRetriever_kotlin]
43+
// [START android_dev_retriever_media3_kotlin]
4144
suspend fun retrieveMetadata(context: Context, mediaItem: MediaItem) {
4245
try {
4346
// 1. Build the retriever and open a .use block.
@@ -53,9 +56,45 @@ class InspectorModuleKotlinSnippets {
5356
throw RuntimeException(e)
5457
}
5558
}
56-
// [END android_media3_inspector_MetadataRetriever_kotlin]
59+
// [END android_dev_retriever_media3_kotlin]
5760

58-
// [START android_media3_inspector_FrameExtractor_kotlin]
61+
// [START android_migration_retriever_platform_kotlin]
62+
fun retrieveMetadataPlatform(mediaPath: String) {
63+
val retriever = MediaMetadataRetriever()
64+
retriever.setDataSource(mediaPath)
65+
try {
66+
val mimeType = retriever.extractMetadata(METADATA_KEY_MIMETYPE)
67+
Log.d(TAG, "MIME type: $mimeType")
68+
} catch (e: Exception) {
69+
throw RuntimeException(e)
70+
} finally {
71+
retriever.release()
72+
}
73+
}
74+
// [END android_migration_retriever_platform_kotlin]
75+
76+
// [START android_migration_retriever_media3_kotlin]
77+
suspend fun retrieveMetadataMedia3(context: Context, mediaItem: MediaItem) {
78+
try {
79+
MetadataRetriever.Builder(context, mediaItem).build().use { retriever ->
80+
val trackGroups = retriever.retrieveTrackGroups().await()
81+
82+
for (i in 0 until trackGroups.length) {
83+
val trackGroup = trackGroups.get(i)
84+
for (j in 0 until trackGroup.length) {
85+
val format = trackGroup.getFormat(j)
86+
val mimeType = format.containerMimeType
87+
Log.d(TAG, "MIME type: $mimeType")
88+
}
89+
}
90+
}
91+
} catch (e: Exception) {
92+
throw RuntimeException(e)
93+
}
94+
}
95+
// [END android_migration_retriever_media3_kotlin]
96+
97+
// [START android_dev_frame_media3_kotlin]
5998
suspend fun extractFrame(context: Context, mediaItem: MediaItem): Bitmap? {
6099
return try {
61100
// 1. Build the extractor and open a .use block.
@@ -71,9 +110,50 @@ class InspectorModuleKotlinSnippets {
71110
null
72111
}
73112
}
74-
// [END android_media3_inspector_FrameExtractor_kotlin]
113+
// [END android_dev_frame_media3_kotlin]
114+
115+
// [START android_migration_frame_platform_kotlin]
116+
fun extractFramePlatform(mediaPath: String, frameTimeMs: Long): Bitmap? {
117+
var retriever: MediaMetadataRetriever? = null
118+
val bitmap: Bitmap?
119+
try {
120+
retriever = MediaMetadataRetriever()
121+
retriever.setDataSource(mediaPath)
122+
123+
bitmap = retriever.getFrameAtTime(
124+
frameTimeMs * 1000L, // Time is in microseconds
125+
OPTION_CLOSEST
126+
)
127+
Log.d(TAG, "Extracted frame : $bitmap")
128+
} catch (e: Exception) {
129+
throw RuntimeException(e)
130+
} finally {
131+
retriever?.release()
132+
}
133+
return bitmap
134+
}
135+
// [END android_migration_frame_platform_kotlin]
136+
137+
// [START android_migration_frame_media3_kotlin]
138+
suspend fun extractFrameMedia3(
139+
context: Context,
140+
mediaItem: MediaItem,
141+
frameTimeMs: Long
142+
): Bitmap? {
143+
return try {
144+
FrameExtractor.Builder(context, mediaItem).build().use { extractor ->
145+
val frame = extractor.getFrame(frameTimeMs).await()
146+
Log.d(TAG, "Extracted frame at ${frame.presentationTimeMs} ms")
147+
frame.bitmap
148+
}
149+
} catch (e: Exception) {
150+
Log.e(TAG, "Exception: $e")
151+
null
152+
}
153+
}
154+
// [END android_migration_frame_media3_kotlin]
75155

76-
// [START android_media3_inspector_MediaExtractorCompat_kotlin]
156+
// [START android_dev_extractor_media3_kotlin]
77157
fun extractSamples(context: Context, mediaPath: String) {
78158
val extractor = MediaExtractorCompat(context)
79159
try {
@@ -103,10 +183,11 @@ class InspectorModuleKotlinSnippets {
103183
} catch (e: IOException) {
104184
throw RuntimeException(e)
105185
} finally {
106-
extractor.release() // 3. Release the extractor
186+
// 3. Release the extractor
187+
extractor.release()
107188
}
108189
}
109-
// [END android_media3_inspector_MediaExtractorCompat_kotlin]
190+
// [END android_dev_extractor_media3_kotlin]
110191

111192
private fun handleMetadata(trackGroups: TrackGroupArray, timeline: Timeline, durationUs: Long) {
112193
Log.d(TAG, "TrackGroups: $trackGroups us")

0 commit comments

Comments
 (0)