Skip to content

Commit

Permalink
优化VideoMetaData信息的获取,只暴露两个api
Browse files Browse the repository at this point in the history
分别是context 和uri模式。另一种是兼容老系统的file
  • Loading branch information
didikee committed Jul 29, 2022
1 parent b61266a commit 1bfc136
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 37 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,5 @@ lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
.idea/runConfigurations.xml
.idea/misc.xml
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 0 additions & 12 deletions .idea/runConfigurations.xml

This file was deleted.

4 changes: 2 additions & 2 deletions androidx/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ android {
defaultConfig {
minSdkVersion 19
targetSdkVersion 30
versionCode 30
versionName "1.3.0"
versionCode 31
versionName "1.3.1"
archivesBaseName = "androidx-$versionName"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
Expand Down
126 changes: 121 additions & 5 deletions androidx/src/main/java/com/androidx/media/VideoMetaData.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,31 @@
package com.androidx.media;

import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;

import androidx.annotation.NonNull;

/**
* user author: didikee
* create time: 1/14/19 6:25 PM
* description:
*/
public final class VideoMetaData {
public final class VideoMetaData implements Parcelable {
//file info
private String displayName;
@Deprecated
private String data;
private String relativePath;
private long dateModified;
private long size;

//video info
private int width;
private int height;

private long duration;
private long size;

// 一下这些参数都可能没有
private int bitRate;
private int rotation;
Expand All @@ -32,6 +46,36 @@ public VideoMetaData(int width, int height, int rotation) {
this.rotation = rotation;
}

protected VideoMetaData(Parcel in) {
displayName = in.readString();
data = in.readString();
relativePath = in.readString();
dateModified = in.readLong();
size = in.readLong();
width = in.readInt();
height = in.readInt();
duration = in.readLong();
bitRate = in.readInt();
rotation = in.readInt();
colorFormat = in.readInt();
frameRate = in.readInt();
iFrameRate = in.readFloat();
videoBitrate = in.readDouble();
audioBitrate = in.readDouble();
}

public static final Creator<VideoMetaData> CREATOR = new Creator<VideoMetaData>() {
@Override
public VideoMetaData createFromParcel(Parcel in) {
return new VideoMetaData(in);
}

@Override
public VideoMetaData[] newArray(int size) {
return new VideoMetaData[size];
}
};

public int getWidth() {
return width;
}
Expand Down Expand Up @@ -132,6 +176,50 @@ public int[] getRealSize() {
return new int[]{realWidth, realHeight};
}

@NonNull
public String getPath() {
if (Build.VERSION.SDK_INT >= 29) {
if (!TextUtils.isEmpty(data)) {
return getData();
}
return getRelativePath();
} else {
return getData();
}
}

public String getDisplayName() {
return displayName;
}

public void setDisplayName(String displayName) {
this.displayName = displayName;
}

public String getData() {
return data;
}

public void setData(String data) {
this.data = data;
}

public String getRelativePath() {
return relativePath;
}

public void setRelativePath(String relativePath) {
this.relativePath = relativePath;
}

public long getDateModified() {
return dateModified;
}

public void setDateModified(long dateModified) {
this.dateModified = dateModified;
}

/**
* 当这些信息是有的表示该视频信息合规
* @return true:视频信息正确
Expand All @@ -143,10 +231,14 @@ public boolean isValid() {
@Override
public String toString() {
return "VideoMetaData{" +
"width=" + width +
"displayName='" + displayName + '\'' +
", data='" + data + '\'' +
", relativePath='" + relativePath + '\'' +
", dateModified=" + dateModified +
", size=" + size +
", width=" + width +
", height=" + height +
", duration=" + duration +
", size=" + size +
", bitRate=" + bitRate +
", rotation=" + rotation +
", colorFormat=" + colorFormat +
Expand All @@ -156,4 +248,28 @@ public String toString() {
", audioBitrate=" + audioBitrate +
'}';
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(displayName);
dest.writeString(data);
dest.writeString(relativePath);
dest.writeLong(dateModified);
dest.writeLong(size);
dest.writeInt(width);
dest.writeInt(height);
dest.writeLong(duration);
dest.writeInt(bitRate);
dest.writeInt(rotation);
dest.writeInt(colorFormat);
dest.writeInt(frameRate);
dest.writeFloat(iFrameRate);
dest.writeDouble(videoBitrate);
dest.writeDouble(audioBitrate);
}
}
38 changes: 21 additions & 17 deletions androidx/src/main/java/com/androidx/utils/MediaMetadataHelper.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.androidx.utils;

import android.content.ContentResolver;
import android.content.Context;
import android.media.MediaExtractor;
import android.media.MediaFormat;
Expand Down Expand Up @@ -60,30 +61,29 @@ class MediaMetadataHelper {

@NonNull
public static VideoMetaData getVideoMetaData(Context context, Uri videoUri) {
long fileSize = 0;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
String pathFromUri = UriUtils.getPathFromUri(context, videoUri);
File file = new File(pathFromUri);
if (file.exists()) {
fileSize = file.length();
}
} else {
MediaUriInfo baseInfo = UriUtils.getBaseInfo(context.getContentResolver(), videoUri);
fileSize = baseInfo == null ? 0 : baseInfo.getSize();
return getVideoMetaData(file);
}
FileDescriptor fileDescriptor = UriUtils.getFileDescriptor(context.getContentResolver(), videoUri, false);
return getVideoMetaData(fileDescriptor, fileSize);
return getVideoMetaDataForUri(context.getContentResolver(), videoUri);
}


@NonNull
public static VideoMetaData getVideoMetaData(FileDescriptor fileDescriptor, long fileSize) {
private static VideoMetaData getVideoMetaDataForUri(ContentResolver resolver, Uri videoUri) {
VideoMetaData metaData = new VideoMetaData();
metaData.setSize(fileSize);
MediaUriInfo baseInfo = UriUtils.getBaseInfo(resolver, videoUri);
if (baseInfo != null) {
metaData.setSize(baseInfo.getSize());
metaData.setDisplayName(baseInfo.getDisplayName());
metaData.setData(baseInfo.getData());
metaData.setDateModified(baseInfo.getDateModified());
metaData.setRelativePath(baseInfo.getRelativePath());
}
FileDescriptor fileDescriptor = UriUtils.getFileDescriptor(resolver, videoUri, false);
if (fileDescriptor == null) {
return metaData;
}

MediaMetadataRetriever mediaMetadataRetriever = null;
try {
mediaMetadataRetriever = new MediaMetadataRetriever();
Expand All @@ -101,25 +101,28 @@ public static VideoMetaData getVideoMetaData(FileDescriptor fileDescriptor, long
try {
mediaExtractor = new MediaExtractor();
mediaExtractor.setDataSource(fileDescriptor);
fillDataFromMediaExtractor(mediaExtractor, metaData, fileSize);
fillDataFromMediaExtractor(mediaExtractor, metaData);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (mediaExtractor != null) {
mediaExtractor.release();
}
}

return metaData;
}


@NonNull
public static VideoMetaData getVideoMetaData(File videoFile) {
VideoMetaData metaData = new VideoMetaData();
if (videoFile == null || !videoFile.exists()) {
return metaData;
}
metaData.setSize(videoFile.length());
metaData.setDisplayName(videoFile.getName());
metaData.setData(videoFile.getAbsolutePath());
metaData.setDateModified(videoFile.lastModified());

MediaMetadataRetriever mediaMetadataRetriever = null;
try {
Expand All @@ -138,7 +141,7 @@ public static VideoMetaData getVideoMetaData(File videoFile) {
try {
mediaExtractor = new MediaExtractor();
mediaExtractor.setDataSource(videoFile.getAbsolutePath());
fillDataFromMediaExtractor(mediaExtractor, metaData, videoFile.length());
fillDataFromMediaExtractor(mediaExtractor, metaData);
} catch (IOException e) {
e.printStackTrace();
} finally {
Expand All @@ -161,7 +164,7 @@ private static void fillDataFromMediaMetadataRetriever(MediaMetadataRetriever re
metaData.setBitRate(parseInteger(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE), 0));
}

private static void fillDataFromMediaExtractor(MediaExtractor extractor, VideoMetaData metaData, long fileSize) {
private static void fillDataFromMediaExtractor(@Nullable MediaExtractor extractor, @NonNull VideoMetaData metaData) {
if (extractor == null) {
return;
}
Expand Down Expand Up @@ -246,6 +249,7 @@ private static void fillDataFromMediaExtractor(MediaExtractor extractor, VideoMe
}
}/*end*/
metaData.setAudioBitrate(audioBitrate);
long fileSize = metaData.getSize();
if (fileSize > 0) {
double fileBitrate = (fileSize * 8.0 / videoDuration);
LogUtils.d("getVideoInfo file bitrate: " + fileBitrate + "/bps");
Expand Down

0 comments on commit 1bfc136

Please sign in to comment.