Android截取视频帧并转化为Bitmap示例
程序员文章站
2023-12-01 19:32:40
mainactivity如下: 复制代码 代码如下: package cn.testmediametadataretriever; import java.io.file;...
mainactivity如下:
package cn.testmediametadataretriever;
import java.io.file;
import java.io.fileoutputstream;
import android.media.mediametadataretriever;
import android.os.bundle;
import android.os.environment;
import android.app.activity;
import android.graphics.bitmap;
import android.graphics.bitmap.compressformat;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
/**
* demo描述:
* 利用mediametadataretriever按照时间截取视频
* 并转换为bitmap存放于sdcard
*
* 特别注意:
* getframeattime()方法第一个参数的单位是微秒 (us)
*
*/
public class mainactivity extends activity {
private button mbutton;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
init();
}
private void init(){
mbutton=(button) findviewbyid(r.id.button);
mbutton.setonclicklistener(new clicklistenerimpl());
}
private class clicklistenerimpl implements onclicklistener{
@override
public void onclick(view v) {
switch (v.getid()) {
case r.id.button:
getbitmapsfromvideo();
default:
break;
}
}
}
public void getbitmapsfromvideo() {
string datapath = environment.getexternalstoragedirectory()+ "/testvideo.mp4";
mediametadataretriever retriever = new mediametadataretriever();
retriever.setdatasource(datapath);
// 取得视频的长度(单位为毫秒)
string time = retriever.extractmetadata(mediametadataretriever.metadata_key_duration);
// 取得视频的长度(单位为秒)
int seconds = integer.valueof(time) / 1000;
// 得到每一秒时刻的bitmap比如第一秒,第二秒
for (int i = 1; i <= seconds; i++) {
bitmap bitmap = retriever.getframeattime(i*1000*1000,mediametadataretriever.option_closest_sync);
string path = environment.getexternalstoragedirectory()+ file.separator + i + ".jpg";
fileoutputstream fos = null;
try {
fos = new fileoutputstream(path);
bitmap.compress(compressformat.jpeg, 80, fos);
fos.close();
} catch (exception e) {
e.printstacktrace();
}
}
}
}
main.xml如下:
<relativelayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取视频的帧图片"
android:layout_centerinparent="true"
/>
</relativelayout>
复制代码 代码如下:
package cn.testmediametadataretriever;
import java.io.file;
import java.io.fileoutputstream;
import android.media.mediametadataretriever;
import android.os.bundle;
import android.os.environment;
import android.app.activity;
import android.graphics.bitmap;
import android.graphics.bitmap.compressformat;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
/**
* demo描述:
* 利用mediametadataretriever按照时间截取视频
* 并转换为bitmap存放于sdcard
*
* 特别注意:
* getframeattime()方法第一个参数的单位是微秒 (us)
*
*/
public class mainactivity extends activity {
private button mbutton;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
init();
}
private void init(){
mbutton=(button) findviewbyid(r.id.button);
mbutton.setonclicklistener(new clicklistenerimpl());
}
private class clicklistenerimpl implements onclicklistener{
@override
public void onclick(view v) {
switch (v.getid()) {
case r.id.button:
getbitmapsfromvideo();
default:
break;
}
}
}
public void getbitmapsfromvideo() {
string datapath = environment.getexternalstoragedirectory()+ "/testvideo.mp4";
mediametadataretriever retriever = new mediametadataretriever();
retriever.setdatasource(datapath);
// 取得视频的长度(单位为毫秒)
string time = retriever.extractmetadata(mediametadataretriever.metadata_key_duration);
// 取得视频的长度(单位为秒)
int seconds = integer.valueof(time) / 1000;
// 得到每一秒时刻的bitmap比如第一秒,第二秒
for (int i = 1; i <= seconds; i++) {
bitmap bitmap = retriever.getframeattime(i*1000*1000,mediametadataretriever.option_closest_sync);
string path = environment.getexternalstoragedirectory()+ file.separator + i + ".jpg";
fileoutputstream fos = null;
try {
fos = new fileoutputstream(path);
bitmap.compress(compressformat.jpeg, 80, fos);
fos.close();
} catch (exception e) {
e.printstacktrace();
}
}
}
}
main.xml如下:
复制代码 代码如下:
<relativelayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取视频的帧图片"
android:layout_centerinparent="true"
/>
</relativelayout>