本周给大家分享如何获取视频的每一帧的信息,说到这个那就得看我们的谷歌官方给我们的提供的api接口类:MediaMetadataRetriever,这个类是提供给我们用来获取视频信息的,
创新互联建站长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为乐亭企业提供专业的成都做网站、网站制作,乐亭网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
官方文档:
通过文档我们知道,我们可以通过它提供的extractMetadata()方法获取视频基本信息,
例如:视频宽、高,时长,作者等,还有通过getFrameAtTime()方法获取对应时长位置的视频帧信息,返回的是一个bitmap对象
通过实践知道,这个方法好是好,但是获取视频帧的速度太慢了,我自己做的实验是,获取一个4分多钟的视频,每隔10秒取一帧,开了4个线程去取,时间大概在10秒左右,这样对于我们来说是不可以忍受的,所以最后在github上找到了一个很好的库推荐给大家:
这个库是基于ffmpeg实现的,同样的实验获取视频帧信息的速度在1秒左右,只开了一个线程,ffmpeg还是依旧的强大啊。
通过本周的学习,自己对于ffmpeg是越来越赶兴趣了,所以买了一本书来研究一下,但是本书讲的都是c语言,所以没办法又把我大学学习的c语言的书找了出来,继续开始着自己的爬坑之旅。
读数据库。Android中所有的多媒体文件除了存储在物理硬盘上,还会将文件信息(路径、id、类型、)保存到数据库中,这样当我们想要获取这些文件的信息时,就不需要耗时的扫描硬盘,只需要读数据库就可以了。Android平台中称手机终端内存为内部存储空间,称SD卡为外部存储空间。针对内部和外部存储空间中的媒体文件信息是分开管理的,各自有独立的数据库管理。外部存储空间和内部存储空间对应的卷标为”external”和”internal”。
前段时间在做视频播放器的时候碰到一个新需求:需要将视频的地理位置显示在视频的详情里面。第一反应就是每一个视频文件都可以记录下来一些信息,这些信息里面包含了经纬度等等,就像照片的ExifInterface类一样。于是就去查看了MediaRecorder类,便发现了这个类里面有public void setLocation(float latitude, float longitude)这么个方法可以给录制的视频设置经纬度。
所以说明视频文件里面是存储了经纬度的,现在的关键就是找到对应的API去获取视频文件存储的经纬度。回忆以前获取视频的某一帧图像使用的是MediaMetadataRetriever类,通过这个对象是否也可以获取一些别的信息呢?创建mediaMetadataRetriever对象后发现了这么个方法:mediaMetadataRetriever.extractMetadata(int keyCode);看见这个方法名就感觉找到了(提炼出元数据),现在还需要一个关键的keyCode。于是进入到这个类里面浏览源码,发现了一大堆的key:
这里我所需要的仅仅是:public static final int METADATA_KEY_LOCATION = 23;
返回的经纬度格式:+22.000+119.999,这里需要将经度部分和纬度部分分割开来。
最后通过Geocoder解析出经纬度对应的具体城市位置:
一部分手机将eMMC存储挂载到 /mnt/external_sd 、/mnt/sdcard2 等节点,而将外置的SD卡挂载到Environment.getExternalStorageDirectory()这个结点,此时,调用Environment.getExternalStorageDirectory(),则返回外置的SD的路径。
而另一部分手机直接将eMMC存储挂载在Environment.getExternalStorageDirectory()这个节点,而将真正的外置SD卡挂载到/mnt/external_sd、/mnt/sdcard2 等节点。此时,调用Environment.getExternalStorageDirectory(),则返回内置的SD的路径。
我们只说第一种情况,并且视频文件在/Sdcard下面
String path = Environment.getExternalStorageDirectory().getPath() + "/文件所在子目录/../你的文件名.*";
String path2 = "文件.*";
File file = new File("/sdcard/../文件.*");
//加载视频:
VideoView videoView = (VideoView)findViewById(R.id.