Android使用MediaMetadataRetriever类获取视频帧时一直无法正确读取路径文件,iamge显示位null

Android使用MediaMetadataRetriever类获取视频帧时一直无法正确读取路径文件,iamge显示位null,第1张

从API 8开始,新增了一个类:

androidmediaThumbnailUtils这个类提供了3个静态方法一个用来获取第一帧得到的Bitmap,2个对进行缩略处理。

public static Bitmap createVideoThumbnail (String filePath, int kind)

第一个参数是文件的路径,第二个参数是指定的大小,有两种选择ThumbnailsMINI_KIND与ThumbnailsMICRO_KIND。

第一种文档上说大小是512 x 384 ,我用一个MP4格式文件测试得到544 x 960,用一个wmv格式文件测试得到160 x 120。明显不靠谱。第二种参数两种格式文件得到的大小都是 96 x 96,这个才是缩略图。extractThumbnail(Bitmap source, int width, int height, int options)

extractThumbnail(Bitmap source, int width, int height)

这两种方法都是用来处理Bitmap的大小的,第一个参数是要处理的Bitmap,第二个参数是处理后宽度,第三个是高度,第四个参数options,如果options定义为OPTIONS_RECYCLE_INPUT,则回收资源。也就是说可以用第三种方法把截取到的第一帧的Bitmap转成任意想要的大小,第三个方法还可以获取内存卡内的缩略图。

Bitmap bitmap = ThumbnailUtilscreateVideoThumbnail(path1, ThumbnailsMINI_KIND);

bitmap = ThumbnailUtilsextractThumbnail(bitmap, 210, 210);

从API 10开始新增一类MediaMetadataRetriever可以用来获取媒体文件的信息

MediaMetadataRetriever mmr = new MediaMetadataRetriever();

mmrsetDataSource(/sdcard/33mp4);

Bitmap bitmap = mmrgetFrameAtTime();

imagesetImageBitmap(bitmap);

Systemoutprintln(mmrextractMetadata(MediaMetadataRetrieverMETADATA_KEY_DATE)+);

Systemoutprintln(mmrextractMetadata(MediaMetadataRetrieverMETADATA_KEY_MIMETYPE)+);

mmrrelease();

MediaMetadataRetriever可以获取任何一帧的缩略图。

public static Bitmap createVideoThumbnail(String filePath) {

// MediaMetadataRetriever is available on API Level 8

// but is hidden until API Level 10

Class clazz = null;

Object instance = null;

try {

clazz = ClassforName(androidmediaMediaMetadataRetriever);

instance = clazznewInstance();

Method method = clazzgetMethod(setDataSource, Stringclass);

methodinvoke(instance, filePath);

// The method name changes between API Level 9 and 10

if (BuildVERSIONSDK_INT <= 9) {

return (Bitmap) clazzgetMethod(captureFrame)invoke(instance);

} else {

byte[] data = (byte[]) clazzgetMethod(getEmbeddedPicture)invoke(instance);

if (data != null) {

Bitmap bitmap = BitmapFactorydecodeByteArray(data, 0, datalength);

if (bitmap != null) return bitmap;

}

return (Bitmap) clazzgetMethod(getFrameAtTime)invoke(instance);

}

} catch (IllegalArgumentException ex) {

// Assume this is a corrupt video file

} catch (RuntimeException ex) {

// Assume this is a corrupt video file

} catch (InstantiationException e) {

Loge(TAG, createVideoThumbnail, e);

} catch (InvocationTargetException e) {

Loge(TAG, createVideoThumbnail, e);

} catch (ClassNotFoundException e) {

Loge(TAG, createVideoThumbnail, e);

} catch (NoSuchMethodException e) {

Loge(TAG, createVideoThumbnail, e);

} catch (IllegalAccessException e) {

Loge(TAG, createVideoThumbnail, e);

} finally {

try {

if (instance != null) {

clazzgetMethod(release)invoke(instance);

}

} catch (Exception ignored) {

}

}

return null;

}

MediaMetadataRetriever是Android原生提供的获取音视频文件信息的一个类,我们可以通过这个类的相关方法获取一些基本信息,如视频时长、宽高、帧率、方向、某一帧的等。

我们可以通过MediaMetadataRetriever的extractMetadata(int keyCode)的方法获取一些视频的基本信息,以下列出一些常用的:

可以通过getFrameAtTime(long timeUs)获取某一时刻附近的帧;API>=28,可以准确获取帧,相关方法getFrameAtIndex();获取帧图可以应用在 视频封面图 视频裁剪的缩略图 等。

MediaMetadataRetriever还是比较常用的,以上只是简略的列出了MediaMetadataRetriever的一些用法,具体可自行查阅源文件。

读数据库。Android中所有的多媒体文件除了存储在物理硬盘上,还会将文件信息(路径、id、类型、)保存到数据库中,这样当我们想要获取这些文件的信息时,就不需要耗时的扫描硬盘,只需要读数据库就可以了。Android平台中称手机终端内存为内部存储空间,称SD卡为外部存储空间。针对内部和外部存储空间中的媒体文件信息是分开管理的,各自有独立的数据库管理。外部存储空间和内部存储空间对应的卷标为”external”和”internal”。

旋转90°就好了:

Bitmap bitmap = BitmapFactorydecodeFile(mCurrentPhotoPath, bmOptions);

   

   Matrix mtx = new Matrix();

   mtxpostRotate(90);

   // Rotating Bitmap

   Bitmap rotatedBMP = BitmapcreateBitmap(bitmap, 0, 0, bitmapgetWidth(), bitmapgetHeight(), mtx, true);

怎么样才可以将视频中的一些音频提取出来呢?把视频中有趣的音频提取出来有难度吗?其实 *** 作非常的简单哦!不管是视频音频或者是音乐音频都是可以提取的,那么接下来就好好和你们说说如何提取音频的吧!具体 *** 作步骤如下:

第一步提取视频音频之前,需要安装一款迅捷音频转换器

第二步打开后你们就会看到它的整体界面,在界面中会有一些功能,这些功能在我们的日常工作中都会遇到,今天我们需要点击的就是音频提取,接着添加文件或者添加文件夹。

第三步文件添加进去之后,提取音频的步骤来了,大家会看到添加片段指南,怎么添加呢?拉动上方的进度条就可以添加了,这个时候你们所看到的当前时间点显示的就是你添加音频的时间,然后点击确定。

第四步在我们点击确定之后,我们就要来到界面的地步,看到文件输出目录点击文件夹就可以选择保存的位置了,当我们的保存位置设置好之后,最后点击开始提取。

第五步等待一会之后,界面你提取的音乐片段都会显示个小对号,这个时候你们的提取已经完成了,然后在你们的保存的文件中就可以打开了。

android系统启动时会去扫描系统文件,并将系统支持的视频文件(mp4,3gp,wmv)扫描到媒体库(MediaStore)中,下面代码演示如何获得这些文件的信息:

public static List<VideoInfo> sysVideoList = null;// 视频信息集合

sysVideoList = new ArrayList<VideoInfo>();

setVideoList();

private void setVideoList() {

// MediaStoreVideoThumbnailsDATA:视频缩略图的文件路径

String[] thumbColumns = { MediaStoreVideoThumbnailsDATA,

MediaStoreVideoThumbnailsVIDEO_ID };

// MediaStoreVideoMediaDATA:视频文件路径;

// MediaStoreVideoMediaDISPLAY_NAME : 视频文件名,如 testVideomp4

// MediaStoreVideoMediaTITLE: 视频标题 : testVideo

String[] mediaColumns = { MediaStoreVideoMedia_ID,

MediaStoreVideoMediaDATA, MediaStoreVideoMediaTITLE,

MediaStoreVideoMediaMIME_TYPE,

MediaStoreVideoMediaDISPLAY_NAME };

cursor = managedQuery(MediaStoreVideoMediaEXTERNAL_CONTENT_URI,

mediaColumns, null, null, null);

if(cursor==null){

ToastmakeText(SystemVideoChooseActivitythis, "没有找到可播放视频文件", 1)show();

return;

}

if (cursormoveToFirst()) {

do {

VideoInfo info = new VideoInfo();

int id = cursorgetInt(cursor

getColumnIndex(MediaStoreVideoMedia_ID));

Cursor thumbCursor = managedQuery(

MediaStoreVideoThumbnailsEXTERNAL_CONTENT_URI,

thumbColumns, MediaStoreVideoThumbnailsVIDEO_ID

+ "=" + id, null, null);

if (thumbCursormoveToFirst()) {

infosetThumbPath(thumbCursorgetString(thumbCursor

getColumnIndex(MediaStoreVideoThumbnailsDATA)));

}

infosetPath(cursorgetString(cursor

getColumnIndexOrThrow(MediaStoreVideoMediaDATA)));

infosetTitle(cursorgetString(cursor

getColumnIndexOrThrow(MediaStoreVideoMediaTITLE)));

infosetDisplayName(cursorgetString(cursor

getColumnIndexOrThrow(MediaStoreVideoMediaDISPLAY_NAME)));

LogUtillog(TAG, "DisplayName:"+infogetDisplayName());

infosetMimeType(cursor

getString(cursor

getColumnIndexOrThrow(MediaStoreVideoMediaMIME_TYPE)));

sysVideoListadd(info);

} while (cursormoveToNext());

}

}

有一点需要注意的是:系统的媒体库并不会在我们添加视频文件后自动更新,我们如何去手动扫描媒体库,或者重启系统才能从媒体库中得到更新的视频文件:

sendBroadcast(new Intent(IntentACTION_MEDIA_MOUNTED, Uriparse("file://"

+ EnvironmentgetExternalStorageDirectory())));

1首先你内存卡上的视频文件的格式是你手机里使用的视频播放器能支持的格式;

2在手机上打开你的视频播放器,在打开文件的路径选择时,选择你的内存卡依次打开,直至你的卡里的视频文件目录,确定就可以了。

以上就是关于Android使用MediaMetadataRetriever类获取视频帧时一直无法正确读取路径文件,iamge显示位null全部的内容,包括:Android使用MediaMetadataRetriever类获取视频帧时一直无法正确读取路径文件,iamge显示位null、【Android音视频】MediaMetadataRetriever使用、android获取内部存储视频数量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9539310.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存