EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能
本文转自: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
获取更多信息
Copyright © EasyDarwin.org 2012-2017
相关文章
- [Android Traffic] android 流量计算方法
- [Android Pro] Android权限设置android.permission完整列表
- [Android UI] listview 自定义style
- 【黑马Android】(01)android简介/工程目录结构/拨号器/四种点击事件/后台偷偷发短信
- 浅论Android网络请求库——android-async-http
- 《android开发艺术探索》读书笔记(十五)--Android性能优化
- 【已解决】unity4.2.0f4 导出Android工程报错:Error building Player: ArgumentException: Illegal characters in path. [unity导出android工程 报错,路径含有非法字符]
- EasyPlayer Android安卓RTSP服务器低延时再优化策略
- 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码
- EasyDarwin相关Android安卓客户端EasyPusher/EasyPlayer/EasyCamera/EasyClient在无开发环境进行log抓取
- EasyRTMP安卓Android手机直播之AAC采集、编码与RTMP推送
- EasyPusher安卓Android手机直播推送之RTSP流媒体协议流程
- EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式
- EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式
- Android开发学习---使用Intelij idea 13.1 进行android 开发
- android脚步---跟随手指动的小球
- 《android开发艺术探索》读书笔记(十五)--Android性能优化
- android安卓应用和OBD的集成场景
- Android修行手册 - GridView实践回忆
- ADT(Android) — Eclipse开发NOX夜神安卓模拟器如何进行横竖屏切换
- Android 10.0 app添加校验锁(输入密码才能进入app)
- Android android studio 项目放在源码中编译
- 【Android Gradle 插件】Module 目录下 build.gradle 配置文件 ( android 闭包块配置 | AppExtension 扩展类型参考文档 )
- 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | ActivityThread 主函数分析 | 应用初始化 | 启动优化项目 )
- 2014 android毕设代做 代做Android毕设 安卓毕设
- Android - 控件android:ems属性
- 基于深度学习的安卓恶意应用检测----------android manfest.xml + run time opcode, use 深度置信网络(DBN)
- Android App封装 —— ViewBinding
- Android系统源码怎么看?Android开发源码精编解析助你高效阅读源码