1616
1717package com .example .snippets ;
1818
19+ import static android .media .MediaMetadataRetriever .METADATA_KEY_MIMETYPE ;
20+ import static android .media .MediaMetadataRetriever .OPTION_CLOSEST ;
21+
1922import android .content .Context ;
23+ import android .graphics .Bitmap ;
2024import android .media .MediaFormat ;
25+ import android .media .MediaMetadataRetriever ;
2126import android .util .Log ;
2227
2328import androidx .annotation .NonNull ;
2429import androidx .annotation .OptIn ;
30+ import androidx .media3 .common .Format ;
2531import androidx .media3 .common .MediaItem ;
2632import androidx .media3 .common .Timeline ;
33+ import androidx .media3 .common .TrackGroup ;
2734import androidx .media3 .common .util .UnstableApi ;
2835import androidx .media3 .exoplayer .MediaExtractorCompat ;
2936import androidx .media3 .exoplayer .source .TrackGroupArray ;
4754public 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 );
0 commit comments