我有一个视频文件,我想获取视频的宽度和高度。我不想玩它,只是为了获得尺寸。 我尝试过使用 MediaPlayer:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(uriString);
mp.prepare();
int width = mp.getVideoWidth();
int height = mp.getVideoHeight();
但它的宽度和高度返回 0,因为 VideoSizeChangedEvent 尚未触发。 如何获取视频的宽度和高度?
UPD:我需要 API 版本 7
这适用于 API 级别 10 及更高版本:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource("/path/to/video.mp4");
int width = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
int height = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
retriever.release();
在某些情况下,我们无法读取元数据。为了保证我们得到宽度和高度,最好使用
Bitmap
创建一个MediaMetadataRetriever
,然后从创建的Bitmap
中获取宽度和高度,如下所示:
public int getVideoWidthOrHeight(File file, String widthOrHeight) {
MediaMetadataRetriever retriever = null;
Bitmap bmp = null;
FileInputStream inputStream = null;
int mWidthHeight = 0;
try {
retriever = new MediaMetadataRetriever();
inputStream = new FileInputStream(file.getAbsolutePath());
retriever.setDataSource(inputStream.getFD());
bmp = retriever.getFrameAtTime();
if (widthOrHeight.equals("width")){
mWidthHeight = bmp.getWidth();
}else {
mWidthHeight = bmp.getHeight();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
} finally{
if (retriever != null){
retriever.release()
}if (inputStream != null){
inputStream.close()
}
}
return mWidthHeight;
}
你可以这样调用上面的方法:
// Get the video width
int mVideoWidth = getVideoWidthOrHeight(someFile, "width");
// Get the video height
int mVideoHeight = getVideoWidthOrHeight(someFile, "height");
这对我有用
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(final MediaPlayer mp) {
int width = mp.getVideoWidth();
int height = mp.getVideoHeight();
}
});
API 级别 7 解决方案:
// get video dimensions
MediaPlayer mp = new MediaPlayer();
try {
mp.setDataSource(filename);
mp.prepare();
mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() {
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
int orient = -1;
if(width < height)
orient = 1;
else
orient = 0;
}
});
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
这实用程序集可与 Android 中的 Size 抽象一起使用。
它包含一个类 SizeFromVideoFile.java 你可以这样使用它:
ISize size = new SizeFromVideoFile(videoFilePath);
size.width();
size.hight();
private static final Uri MOVIE_URI = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
private static final String[] MOVIE_PJT = new String[] {
MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA,
MediaStore.Video.Media.TITLE, MediaStore.Video.Media.DATE_TAKEN,
MediaStore.Video.Media.MIME_TYPE, MediaStore.Video.Media.DURATION,
MediaStore.Video.Media.SIZE, MediaStore.Video.Media.RESOLUTION };
尝试从系统内容提供商处查询。它将返回视频(本地文件)的一些有用信息
Kotlin 版本🚨
data class VideoSize(val width: Int, val height: Int)
扩展功能
fun Uri.getVideoSize(): VideoSize {
val retriever = MediaMetadataRetriever()
retriever.setDataSource(appContext, this)
val width =
retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)?.toInt() ?: 0
val height =
retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)?.toInt() ?: 0
retriever.release()
return VideoSize(width, height)
}
我的应用程序中使用的 kotlin 版本参考了 user493244 的答案
/**
* determine video width and height
*
*
* Refer to [stackoverflow](https://stackoverflow.com/questions/9077436/how-to-determine-video-width-and-height-on-android)
* answer of [user493244](https://stackoverflow.com/users/493244/user493244)
*
* @param file string with file pathname to use
* @param widthOrHeight string with size required (width or height)
* @return mWidthHeight int with video width or height
*/
fun getVideoWidthOrHeight(file: String?, widthOrHeight: String): Int {
var retriever: MediaMetadataRetriever? = null
val bmp: Bitmap?
//
var mWidthHeight = 0
try {
retriever = MediaMetadataRetriever()
//
retriever.setDataSource(file)
bmp = retriever.frameAtTime
mWidthHeight = if (widthOrHeight == getString(R.string.width)) {
bmp!!.width
} else {
bmp!!.height
}
} catch (e: RuntimeException) {
e.printStackTrace()
} finally {
if (retriever != null) {
try {
retriever.release()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
return mWidthHeight
}