EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能
来源:互联网 发布:尚硅谷mysql视频下载 编辑:程序博客网 时间:2024/06/06 05:09
本文转自:http://blog.csdn.net/jyt0551/article/details/56942795
对于一个裸的RTSP URL,存放在播放列表上略显单调与枯燥。大家可以看到EasyPlayer在播放完视频后会保存一帧图片到列表上。
那么这个功能是如何做到的呢?
如果自己实现解码的话,比如使用ffmpeg解码,这种情况下,将视频帧解码,再编码成jpeg保存下来,应该不是什么难事。相信大多数播放器都是这样处理的。
H264格式的视频码流=>解码=>YUV格式的视频帧=>压缩=>jpeg=>保存到本地
但是如果我们用硬解码,很遗憾,安卓的硬解码并没有提供获取视频帧数据的功能,那又该如何实现呢?
有两种方法可以实现硬解码截屏
- 单独创建只为抓图用的软解码器并用上面的方法来抓图
- 直接获取TextureView的内容并保存
这里介绍下第二种方法。TextureView提供了一个getBitmap() 的方法,解释如下:
Returns a Bitmap representation of the content of the associated surface texture.
该方法提供了当前TextureView的渲染内容,作为一个Bitbmap对象返回。这样我们可以将这个Bitmap压缩成jpeg、png等格式并保存下来。Bitmap提供了compress 方法可以直接压缩。下面为从TextureView获取并存储Bitmap对象的方法:
public void takePicture(final String path) { try { if (mWidth <= 0 || mHeight <= 0) { return; } Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); mSurfaceView.getBitmap(bitmap); saveBitmapInFile(path, bitmap); bitmap.recycle(); } catch (OutOfMemoryError error) { error.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } }
下面是将Bitmap保存成JPEG的方法,这里,同时会将缩略图保存在安卓系统的相册中,以便调用系统的选取图片的方法可以访问到:
private void saveBitmapInFile(final String path, Bitmap bitmap) { FileOutputStream fos = null; try { fos = new FileOutputStream(path); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); if (mScanner == null) { MediaScannerConnection connection = new MediaScannerConnection(getContext(), new MediaScannerConnection.MediaScannerConnectionClient() { public void onMediaScannerConnected() { mScanner.scanFile(path, null /* mimeType */); } public void onScanCompleted(String path1, Uri uri) { if (path1.equals(path)) { mScanner.disconnect(); mScanner = null; } } }); try { connection.connect(); } catch (Exception e) { e.printStackTrace(); } mScanner = connection; } } catch (IOException e) { e.printStackTrace(); } catch (OutOfMemoryError error) { error.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
这里需要注意的是getBitmap函数的调用时机,
- 首先一定要在TextureView创建之后调用。即在onSurfaceTextureAvailable方法回掉之后才能调用,否则Texture尚未创建,该函数会返回null 。
- 不仅如此,还需要在视频播放之后再调用。否则TextureView所展示的内容为空,因此您保存的快照可能是纯黑色的。
EasyPlayer项目介绍
EasyPlayer & EasyPlayerPro是由EasyDarwin团队开发和维护的一个流媒体播放器项目,目前支持Windows(支持多窗口、包含ActiveX,npAPI Web插件)、Android平台,iOS平台,视频支持H.264,H.265,MPEG4,MJPEG,音频支持G711A,G711U,G726,AAC,支持RTSP over TCP/UDP、RTMP、HTTP、HLS等多种协议,支持硬解码,是一套极佳的流媒体全平台播放组件!
Github项目地址:https://github.com/EasyDarwin/EasyPlayer
https://github.com/EasyDarwin/EasyPlayer_Android
获取更多信息
邮件:support@easydarwin.org
WEB:www.EasyDarwin.org
Copyright © EasyDarwin.org 2012-2017
- EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能
- EasyPlayer Android安卓流媒体播放器实现播放同步录像功能实现(附源码)
- EasyPlayer RTSP安卓Android播放器架构简析
- android集成EasyPlayer播放器播放实时流媒体视屏
- EasyPlayer RTSP Android安卓播放器实现视频源快速切换
- 安防监控直播中无插件web直播方案中实现快照抓取的功能
- EasyPlayer Android RTSP流媒体播放器结构浅析
- EasyIPCamera Android结合EasyPlayer播放器实现教室、会议、展销同屏直播
- EasyPlayer RTSP Android安卓播放器修复播放画面卡在第一帧bug
- EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器
- EasyPlayer实现视频播放局部缩放、广角平移功能(类似水滴直播,快手视频)
- EasyPlayer RTSP 安卓Android播放器显示模式设置方法
- EasyPlayer实现直播抓拍
- EasyPlayerPro安卓流媒体播放器实现Android H.265硬解码流程
- EasyPlayer Android基于ffmpeg实现播放(RTSP/RTMP/HTTP/HLS)同步录像功能
- [转载]EasyPlayer实现直播抓拍
- EasyPlayer实现播放时同步录像的功能
- [转]EasyPlayer实现播放时同步录像的功能
- 让程序员跳槽的非钱原因
- MLY -- 14.Evaluating multiple ideas in parallel during error analysis
- iOS 中图片的解压缩
- vs 快捷键
- 某人有8角的邮票5张,1元的邮票4张,1元8角的邮票6张,用这些邮票中的一张或若干张可以得到多少中不同的邮资?
- EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能
- AchartEngine 笔记
- iFunFactory是一家韩国游戏服务器公司
- jQuery知识点总结和归纳
- Java和JavaScript简单对比
- PAT A1003. Emergency (25)
- 安卓使用VideoView播放raw目录的视频和sd卡的视频
- WiKitude6.0中文教程
- 实现自定义checkbox、radio样式