Android 视频截图方法

转载出处:http://blog.csdn.net/matrix_laboratory/article/details/43267907


1. 前言

本文讨论的是获取视频在某个时间点的图像, 而非屏幕截图.

如果要获取屏幕截图的话直接(电源键+音量下)


2. 获取视频截图

2.1 MediaMetadataRetriever

MediaMetadataRetriever从名称上看可以获取视频的Metadata信息, 此外还可以获取视频的截图, 其中抽取视频的缩略图就是采用此函数实现的.

2.2 使用方法

采用MediaMetadatRetriever.getFrameAtTime方法获取视频的该帧图像.

public Bitmap getFrameAtTime (long timeUs)

public Bitmap getFrameAtTime (long timeUs, int option)

需要注意的是:

该时间点的单位是微秒,普通时间的单位都是毫秒;


option : 

OPTION_CLOSEST: 获取离timeUs最近的一帧图像.

此函数获取的帧是Sync Frame, 由于在timeUs此时间点不一定恰好有一个Sync Frame, 所以会有一定的误差.

获取Sync Frame时 有3中情况:

(1) 在timeUs处恰好有一个Sync Frame

(2) 获取timeUs前一个Sync Frame

(3) 获取timeUs后一个Sync Fram


OPTION_PREVIOUS_SYNC: (1) or (2)

OPTION_NEXT_SYNC: (1) or (3)

OPTION_CLOSEST_SYNC: 获取离timeUs最近的一个Sync Frame



 
 
[java] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. MediaMetadataRetriever retriever = new MediaMetadataRetriever();  
  2. try {  
  3.     retriever.setDataSource(mFilePath);  
  4.     Bitmap bitmap = retriever.getFrameAtTime(miCurPos*1000);  
  5.     String path = Environment.getExternalStorageDirectory() + File.separator  
  6.             + Environment.DIRECTORY_DCIM + "/Camera";  
  7.     path += Tools.getDisplayName(mFilePath) + "_" + Tools.IntToTimeString(miCurPos) + "_" + ".png";  
  8.     Tools.saveBitmap(bitmap, path);  
  9.   
  10.     sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(path))));  
  11. catch (IllegalArgumentException e) {  
  12.     e.printStackTrace();  
  13.     VideoLogger.e(TAG, "MediaMetadataRetriever.setDataSource Failed: " + mFilePath);  
  14.     ShowToast(mResources.getString(R.string.info_screen_shot_failed), 0);  
  15. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以使用SurfaceView来进行截图操作。SurfaceView是一个可以在后台线程中进行绘制操作的View,它可以用来显示相机预览、视频播放等。 要实现SurfaceView的截图,可以采用以下步骤: 1. 首先,需要在布局文件中添加SurfaceView控件,用来显示需要截图的内容。 2. 在Activity中,获取SurfaceView实例,并设置其回调函数。 3. 在SurfaceView的回调函数中,实现绘制功能的代码。可以通过Canvas对象来进行绘制操作,即在SurfaceView上绘制需要截图的内容。 4. 实现截图方法,可以通过将Canvas对象绘制的内容保存为Bitmap对象,从而得到截图结果。 具体的实现代码如下所示: ``` // 1.在布局文件中添加SurfaceView控件 <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> // 2.在Activity中获取SurfaceView实例,并设置回调函数 SurfaceView surfaceView = findViewById(R.id.surfaceView); surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { // 初始化SurfaceView并进行绘制操作 drawOnSurface(holder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // SurfaceView大小改变的处理操作 } @Override public void surfaceDestroyed(SurfaceHolder holder) { // SurfaceView销毁的处理操作 } }); // 3.绘制操作的代码 private void drawOnSurface(SurfaceHolder holder) { Canvas canvas = holder.lockCanvas(); // 获取Canvas对象 // 在Canvas上进行绘制操作 // ... holder.unlockCanvasAndPost(canvas); // 解锁Canvas并显示绘制结果 } // 4.实现截图方法 private Bitmap takeScreenshot() { SurfaceView surfaceView = findViewById(R.id.surfaceView); Bitmap bitmap = Bitmap.createBitmap(surfaceView.getWidth(), surfaceView.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); surfaceView.draw(canvas); return bitmap; } ``` 通过以上步骤,我们可以实现在SurfaceView上进行绘制,并通过截图方法获取绘制的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值