Android平台GB28181设备接入端实现实时快照

Android平台GB28181设计开发的时候,有个功能必不可少的:实时快照,特别是用于执法记录仪等场景下,用于图像留底或分析等考量。

实时快照的实现并不难,目前实现有两种方式,一种是拿到数据(比如摄像头数据)后,直接上层编码,存取快照;另一种模式是,数据投递到JNI层,底层针对投递过来的编码前数据,做png编码,并保存到设定的目录下,今天我们主要探讨第二种实现模式。

我们在publisher实例初始化的时候,设置是否启用快照:

private void InitAndSetConfig() {int audio_opt = 1;int fps = 18;int gop = fps * 2;Log.i(TAG, "InitAndSetConfig video_width: " + video_width_ + " cur_video_height" + video_height_ + " imageRotationDegree:" + cameraImageRotationDegree_);publisherHandle = libPublisher.SmartPublisherOpen(context_, audio_opt, 3,  video_width_, video_height_);if (publisherHandle == 0) {Log.e(TAG, "sdk open failed!");return;}Log.i(TAG, "publisherHandle=" + publisherHandle);if(videoEncodeType == 1)  {int h264HWKbps = setHardwareEncoderKbps(true, video_width_, video_height_);h264HWKbps = h264HWKbps*fps/25;Log.i(TAG, "h264HWKbps: " + h264HWKbps);int isSupportH264HWEncoder = libPublisher.SetSmartPublisherVideoHWEncoder(publisherHandle, h264HWKbps);if (isSupportH264HWEncoder == 0) {libPublisher.SetNativeMediaNDK(publisherHandle, 1);Log.i(TAG, "Great, it supports h.264 hardware encoder!");}}else if (videoEncodeType == 2) {int hevcHWKbps = setHardwareEncoderKbps(false, video_width_, video_height_);hevcHWKbps = hevcHWKbps*fps/25;Log.i(TAG, "hevcHWKbps: " + hevcHWKbps);int isSupportHevcHWEncoder = libPublisher.SetSmartPublisherVideoHevcHWEncoder(publisherHandle, hevcHWKbps);if (isSupportHevcHWEncoder == 0) {libPublisher.SetNativeMediaNDK(publisherHandle, 1);Log.i(TAG, "Great, it supports hevc hardware encoder!");}}boolean is_sw_vbr_mode = true;if(is_sw_vbr_mode)	//H.264 software encoder{int is_enable_vbr = 1;int video_quality = CalVideoQuality(video_width_, video_height_, true);int vbr_max_bitrate = CalVbrMaxKBitRate(video_width_, video_height_);libPublisher.SmartPublisherSetSwVBRMode(publisherHandle, is_enable_vbr, video_quality, vbr_max_bitrate);}if (is_pcma_) {libPublisher.SmartPublisherSetAudioCodecType(publisherHandle, 3);} else {libPublisher.SmartPublisherSetAudioCodecType(publisherHandle, 1);}libPublisher.SetSmartPublisherEventCallbackV2(publisherHandle, new EventHandePublisherV2());libPublisher.SmartPublisherSetSWVideoEncoderProfile(publisherHandle, 3);libPublisher.SmartPublisherSetSWVideoEncoderSpeed(publisherHandle, 2);libPublisher.SmartPublisherSetGopInterval(publisherHandle, gop);libPublisher.SmartPublisherSetFPS(publisherHandle, fps);// libPublisher.SmartPublisherSetSWVideoBitRate(publisherHandle, 600, 1200);boolean is_noise_suppression = true;libPublisher.SmartPublisherSetNoiseSuppression(publisherHandle, is_noise_suppression ? 1 : 0);boolean is_agc = false;libPublisher.SmartPublisherSetAGC(publisherHandle, is_agc ? 1 : 0);int echo_cancel_delay = 0;libPublisher.SmartPublisherSetEchoCancellation(publisherHandle, 1, echo_cancel_delay);libPublisher.SmartPublisherSaveImageFlag(publisherHandle, 1);
}

记得留意最后一句:libPublisher.SmartPublisherSaveImageFlag(publisherHandle, 1);

相关接口说明如下:

 /*** Set if needs to save image during publishing stream(设置是否启用快照)** @param is_save_image: if with 1, it will save current image via the interface of SmartPlayerSaveImage(), if with 0: does not it** @return {0} if successful*/public native int SmartPublisherSaveImageFlag(long handle,  int is_save_image);

设置后,页面有需要实时快照的数据时,点击“实时快照”按钮即可,需要注意的是,实时快照需要存储路径和保存下来的快照文件名称。具体实现如下:

class ButtonCaptureImageListener implements View.OnClickListener {@SuppressLint("SimpleDateFormat")public void onClick(View v) {if(isPushingRtmp || isRecording || isRTSPPublisherRunning || isGB28181StreamRunning){String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());String imageFileName = "dn_" + timeStamp;    //创建以时间命名的文件名称String imagePath = imageSavePath + "/" + imageFileName + ".png";Log.i(TAG, "imagePath:" + imagePath);libPublisher.SmartPublisherSaveCurImage(publisherHandle, imagePath);}else{Log.e(TAG, "快照失败,请确保在推送、录像、GB28181推送或内置RTSP服务发布状态..");}}
}

快照截取成功后,publisher实例会回调以下事件:

case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_CAPTURE_IMAGE:publisher_event = "快照: " + param1 + " 路径:" + param3;if (param1 == 0) {publisher_event = publisher_event + "截取快照成功..";} else {publisher_event = publisher_event + "截取快照失败..";}break;

由于实时快照,功能复杂度不高,而且也可以在上层实现,很容易被忽略,如果做的精细的话,还是需要开发者花费一定的心思。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uc浏览器怎么看历史记录 uc浏览器网页历史记录查看方法

很多用户发现UC浏览器的历史记录查看不了,怎么找也找不到,不要急,它只是换了个位置而已,那么下面小编就来跟大家说一说UC浏览器网页历史记录查看方法。 方法一:点击右上角的UC图标,在弹出来的菜单中你就会…

Win11如何跳过开机更新 Win11跳过开机更新教程

已经有很多用户更新升级到win11系统了吧,但是有用户发现偶尔开机会出现自动更新,导致无法及时开机使用,那win11统如何跳过开机更新呢?可以先使用电源键取消这次更新,然后进入系统取消更新检测就可以了。 win11怎么跳过开机更新&…

Android国标接入端如何播放GB28181平台端语音广播数据

GB28181语音广播这块,我们依据GB/T28181-2016针对流程和实例代码,做过详细的描述,本次主要是探讨下,广播数据过来后,如何处理。 鉴于我们之前有非常成熟的RTMP|RTSP低延迟播放模块,语音广播数据过来后&…

Win11和Win10有什么区别 Win11和Win10区别对比

Win11是微软全新一代操作系统,在界面和功能上和Win10相比还是有不少区别的,如果你还在犹豫要不要升级Win11的话,那么不妨来看看Win11和Win10之间有哪些区别吧。 1、 开始菜单:简单的图标,没有动态磁贴 Windows 11 的…

Android平台RTSP、RTMP播放端如何实现YUV或ARGB数据按设定角度旋转

做音视频RTSP或RTMP直播播放器的时候,不免会遇到这样的诉求,实时播放或快照的时候,由于前端摄像头安装角度不一定是正向,导致播放或快照的时候,视频view显示的画面是呈90 180甚至270旋转的。 以Android平台为例&#…

Win11任务栏颜色如何更改 Win11更改任务栏颜色教程

win11系统中任务栏颜色默认为浅蓝色,有用户认为它可能会与白色的网页或界面重叠,影响自己的操作,想问问有没有什么方法可以更改任务栏的颜色。可以通过更改主题或者更改深色浅色模式来更改任务栏的颜色,将其调整为自己喜欢的颜色。…

国网B接口注册(REGISTER)接口描述和消息示例

技术背景 电网视频监控系统是智能电网的一个重要组成部分,广泛应用于电网的建设、生产、运行、经营等方面。由于视频监控系统在不同的建设时期选用了不同的技术和不同厂家的产品,导致了标准不统一、技术路线不一致。目前国家电网公司智能电网建设&#…

Win7系统怎么设置虚拟内存

我们在日常生活中使用电脑的时候,有时候会以你为系统内存不足导致系统崩溃,甚至严重的还会导致电脑死机。电脑内存不足的时候,那么Win7系统怎么设置虚拟内存呢?如果您不会设置虚拟内存的话,就让小编来教教你Win7系统设置虚拟内存…

国网B接口资源上报(Push_Resourse)接口描述和消息示例

上篇blog,梳理了国网B接口的REGISTER接口描述和消息示例,前端系统加电启动并初次注册成功后,向平台上报前端系统的设备资源信息(包括:视频服务器、DVR/DVS、摄像机、告警设备、环境量采集设备等模拟或数字信号采集设备…

Win7电脑无法获取ip地址怎么解决

有的朋友会遇到了电脑无法获取ip地址的情况,一般ip地址是路由自动分配的,如果获取不到ip可能是路由器出来问题,那Win7电脑无法获取ip地址怎么解决呢?今天小编带给大家win7系统电脑无法获取ip地址的解决方法,一起来看看吧。 Win7…

GB/T 28181-2016多响应消息传输探究

我们在实现Android平台GB28181设备接入模块的时候,有遇到发送多条记录的情况,本文主要探讨下GB28181多响应传输。 规范解读 如GB/T28181-2016规范所说:目录查询响应、文件查询响应、订阅后的通知消息会出现响应、通知消息需发送多条记录的情…

windows7系统设置动态屏保的教程

我们知道电脑在长时间没有操作的情况下就会自动锁屏,可以起到保护我们隐私的作用,也可以起到一个美观的作用,那系统自带的屏保我们不满意的话,想重新设置却不知道在哪里设置怎么办?没关系下面给大家带来了windows7系统设置动态屏…

Android平台GB28181设备接入端语音广播如何实现实时音量调节

Android平台GB28181设备接入,语音广播功能非常重要,本文要介绍的,不是语音广播的流程,语音广播流程,之前的blog也有非常详细的分享,感兴趣的可以参考官方规范书的交互流程: 语音广播这块&#x…

GB28181基于TCP协议的视音频媒体传输探究及实现

我们先看看官方规范针对TCP协议的视音频传输描述: 实时视频点播、历史视频回放与下载的 TCP媒体传输应支持基于RTP封装的视音频PS流,封装格式参照IETFRFC4571。 流媒体服务器宜同时支持作为TCP媒体流传输服务端和客户端。默认情况下,前端设…

qq浏览器怎么导入其他浏览器收藏夹

现在浏览器种类非常多,有时候由于特殊需要,一个电脑有好几个浏览器,在使用浏览器的过程中收藏夹里的东西非常的多,但时间越久,收藏夹东西累计得越来也多,我们记性再好也会偶尔记不住自己需要的东西是在哪个…

Android平台GB28181接入端如何对接UVC摄像头?

我们在对接Android平台GB28181接入的时候,有公司提出这样的需求,除了采集执法记录仪摄像头自带的数据外,还想通过执法记录仪采集外接UVC摄像头。 实际上,这块对我们来说有点炒冷饭了,不算新的诉求。​大牛直播SDK​在2…

win10系统电脑wifi图标不见了的开启方法

很多的用户都习惯了在桌面右下方的小图标中设置网络,但是很多时候都遇到了图标不见了的情况,win10系统电脑wifi图标不见了怎么办呢?就此问题,今天就为你们带来了win10系统电脑wifi图标不见了的开启方法,一起看看吧。 w…

Android平台实现系统内录(捕获播放的音频)并推送RTMP服务技术方案探究

几年来,我们在做无纸化同屏或在线教育相关场景的时候,总是被一件事情困扰:如何实现Android平台的系统内录,并推送到其他播放端,常用的场景比如做无纸化会议或教育的时候,主讲人或老师需要放一个视频&#x…

windows10电脑无法连接到internet怎么解决

许多上网的小伙伴都不知道电脑无法连接到internet怎么办而导致电脑没法上网的问题,windows10电脑无法连接到internet怎么解决?就此问题,今天就专门为大家带来了电脑无法连接到internet解决方法,快来学习看看吧。 windows10电脑无法连接到int…

Android平台GB28181设备接入端PTZ对接详解

PTZCmd实现背景 上一篇blog“Android平台GB28181设备接入模块之球机/云台控制探究”谈到,Android平台做国标GB28181设备接入端的时候,PTZ控制要不要处理?如果处理,难度大不大? 首先说要不要处理:如果只是…