Android平台RTSP|RTMP播放端实时快照保存JPG还是PNG?
JPG还是PNG?
实际上,在前几天的blog,我们有从压缩方式、图像质量、透明效果、可编辑性等各方面做过差异化的介绍。
- 压缩方式:JPG是一种有损压缩格式,通过丢弃图像数据来减小文件大小,因此可能会损失一些图像细节和质量。而PNG使用的是无损压缩格式,它不会丢失任何原始图像数据,从而保持了图像的完整性和质量。
- 图像质量:由于压缩方式的不同,JPG在压缩后会牺牲一部分图像数据,因此在图像质量上可能存在损失,例如可能会出现锯齿状边缘或颜色失真。相比之下,PNG的无损压缩可以保证原图像数据的完整性,其256个透明层次的设定可以使图片边缘平滑融合,从而消除图片锯齿边缘。
- 透明效果:PNG支持透明度,可以用作背景透明的图片,而JPG则不支持透明效果。因此,如果你需要制作半透明的图像或者需要背景透明的图片,PNG是一个更好的选择。
- 可编辑性:JPG是一种不可编辑的图片格式,一旦被保存为JPG格式,就无法进行修改。而PNG是一种可编辑的图片格式,可以通过图像编辑软件(如Photoshop)进行修改、编辑和重新保存。例如,你可以改变PNG图片中的文字样式、线条等元素。
Android平台RTSP|RTMP播放器快照
Android平台RTSP|RTMP播放器截图,我们都是直接保存png图片,新的接口,jpg和png均支持。
原接口:
/*** 请使用新的CaptureImage接口, 这个接口只能保存为PNG图片, 不再推荐使用* Save current image during playback stream(实时快照)** @param handle: return value from SmartPlayerOpen()** @param imageName: image name, which including fully path, "/sdcard/daniuliveimage/daniu.png", etc.** @return {0} if successful*/public native int SmartPlayerSaveCurImage(long handle, String imageName);
值得注意的是,原接口如果需要截图,还需要调用SmartPlayerSaveImageFlag()。
新的接口,我们设计如下:
/*** 新的截图接口, 支持JPEG和PNG两种格式* @param compress_format: 压缩格式, 0:JPEG格式, 1:PNG格式, 其他返回错误* @param quality: 取值范围:[0, 100], 值越大图像质量越好, 仅对JPEG格式有效, 若是PNG格式,请填100* @param file_name: 图像文件名, 例如:/dirxxx/test20231113100739.jpeg, /dirxxx/test20231113100739.png* @param user_data_string: 用户自定义字符串* @return {0} if successful*/public native int CaptureImage(long handle, int compress_format, int quality, String file_name, String user_data_string);
如何调用?
btnCaptureImage.setOnClickListener(new Button.OnClickListener() {@SuppressLint("SimpleDateFormat")public void onClick(View v) {if (0 == playerHandle)return;if (null == capture_image_date_format_)capture_image_date_format_ = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS");String timestamp = capture_image_date_format_.format(new Date());String imageFileName = timestamp;String image_path = imageSavePath + "/" + imageFileName;int quality;boolean is_jpeg = true;if (is_jpeg) {image_path += ".jpeg";quality = 100;}else {image_path += ".png";quality = 100;}int capture_ret = libPlayer.CaptureImage(playerHandle,is_jpeg?0:1, quality, image_path, "test cix");Log.i(TAG, "capture image ret:" + capture_ret + ", file:" + image_path);}});
截图成功,对应的event回调如下:
class EventHandeV2 implements NTSmartEventCallbackV2 {@Overridepublic void onNTSmartEventCallbackV2(long handle, int id, long param1,long param2, String param3, String param4, Object param5) {String player_event = "";switch (id) {case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_STARTED:player_event = "开始..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_CONNECTING:player_event = "连接中..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_CONNECTION_FAILED:player_event = "连接失败..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_CONNECTED:player_event = "连接成功..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_DISCONNECTED:player_event = "连接断开..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_STOP:player_event = "停止播放..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_RESOLUTION_INFO:player_event = "分辨率信息: width: " + param1 + ", height: " + param2;break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_NO_MEDIADATA_RECEIVED:player_event = "收不到媒体数据,可能是url错误..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_SWITCH_URL:player_event = "切换播放URL..";break;case NTSmartEventID.EVENT_DANIULIVE_ERC_PLAYER_CAPTURE_IMAGE:player_event = "快照: " + param1 + " 路径:" + param3;if (param1 == 0)player_event = player_event + ", 截取快照成功";elseplayer_event = player_event + ", 截取快照失败";if (param4 != null && !param4.isEmpty())player_event += (", user data:" + param4);break;..........}if (player_event.length() > 0) {Log.i(TAG, player_event);Message message = new Message();message.what = PLAYER_EVENT_MSG;message.obj = player_event;handler.sendMessage(message);}}}
总结
大家都知道,JPG(JPEG)是有损压缩格式,保持图片质量的同时,通过牺牲一部分图像信息来减小文件尺寸。所以,JPG适合用于存储照片和其他复杂的图像。JPG格式的文件通常比PNG格式的文件小,因此在网络传输和存储时更为方便。
相关文章:

Android平台RTSP|RTMP播放端实时快照保存JPG还是PNG?
JPG还是PNG? 实际上,在前几天的blog,我们有从压缩方式、图像质量、透明效果、可编辑性等各方面做过差异化的介绍。 压缩方式:JPG是一种有损压缩格式,通过丢弃图像数据来减小文件大小,因此可能会损失一些图…...
【人工智能】之深入了解嵌入模型中的 Token:NLP 中的语义之旅(1)
自然语言处理(NLP)领域的发展在很大程度上受到了嵌入模型的推动。嵌入模型通过将文本中的每个 token 转换为向量表示,为计算机理解语言提供了强大的工具。本文将深入研究嵌入模型中的 token,揭示它在 NLP 中的重要性以及在语义表示…...

UML-实现图(组件图和部署图)
实现图是从系统的层次来描述的,描述硬件的组成和布局,描述软件系统划分和功能实现。 UML-实现图(组件图和部署图) 一、组件图1.组件图的元素(1)组件(2)接口(3)…...

苹果Find My可查找添加32件物品,伦茨科技ST17H6x芯片加速产品赋能
苹果最近更新的支持文档证实,从 iOS 16 开始,"Find My"可查找添加物品从16件增加到32件,AirTag 和“查找”网络中的物品利用“查找”网络的强大功能来发挥作用,这个网络由数亿台加密的匿名 Apple 设备构成。“查找”网络…...

postman后端测试时invalid token报错+token失效报错解决方案
报错信息1{“msg”:“invalid token”,“code”:401} 没有添加postman的token信息 报错信息2{“msg”: “token失效,请重新登录”,“code”: 401} 写了token但是token信息写的是错的,会提示token失效 解决方案如下 仅写完后端的查询,但是前端还没写的时候,可…...

使用 mybatis-plus 的mybaits的一对多时, total和record的不匹配问题
应该是框架的问题,去官方仓库提了个issues,等回复 https://github.com/baomidou/mybatis-plus/issues/5923 回复来了: 背景 发现 record是两条,但是total显示3 使用resultMap一对多时,三条数据会变成两条࿰…...

SpringCloud之Nacos
一、微服务介绍 1. 什么是微服务 2014年,Martin Fowler(马丁福勒 ) 提出了微服务的概念,定义了微服务是由以单一应用程序构成的小服务,自己拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用 HTTP API 通信。同时服务会使用最小的规模…...

小封装高稳定性振荡器 Sg2520egn / sg2520vgn, sg2520ehn / sg2520vhn
描述 随着物联网和ADAS等5G应用的实施,数据流量不断增长,网络基础设施变得比以往任何时候都更加重要。IT供应商一直在快速建设数据中心,并且对安装在数据中心内部/内部的光模块有很大的需求。此应用需要具有“小”,“低抖动”和“…...

使用 Apache POI 更新/覆盖 特定的单元格
使用 Apache POI 更新特定的单元格 一. 需求二. 实现三. 效果 一. 需求 将以下表中第4行,第4列的单元格由“张宇”更新为“汤家凤”,并将更行后的结果写入新的Excel文件中; 二. 实现 使用Apache POI,可以精确定位到需要更改的单…...

Spring Boot整合MyBatis-Plus
引言 在现代软件开发中,我们经常需要处理大量的数据。为了有效地管理这些数据,我们需要使用一些强大的框架。其中,Spring Boot和MyBatis-Plus是两个非常流行的框架。Spring Boot是一个基于Spring的开源Java框架,可以用于创建独立…...
springboot项目之AOP角色权限的判断
引言 开发的项目中,可能遇到不同的角色,不同的角色有不通的权限定义。AOP切面是个很好的解决方案。 实践 1. 定义MerchRoles Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface MerchRoles {} 2. 定义切点 public c…...
Twincat PLC 跳出循环
在TwinCAT PLC编程中,要跳出循环结构通常可以通过以下几种方式实现: 使用Break指令: 在TwinCAT 3的PLC编程环境中(IEC 61131-3标准),可以使用BREAK指令来立即终止最内层的循环。例如,在FOR或WH…...

【Leetcode】277.搜寻名人
一、题目 1、题目描述 假设你是一个专业的狗仔,参加了一个 n 人派对,其中每个人被从 0 到 n - 1 标号。在这个派对人群当中可能存在一位 “名人”。所谓 “名人” 的定义是:其他所有 n - 1 个人都认识他/她,而他/她并不认识其他任何人。 现在你想要确认这个 “名人” 是…...

小白数学建模 Mathtype 7.7傻瓜式下载安装嵌入Word/WPS以及深度使用教程
数学建模Mathtype的下载安装嵌入Word/WPS以及深度使用教程 一 Mathtype 的下载安装1.1 安装前须知1.2 下载压缩包1.3 安装注册 二 嵌入Word/WPS2.1 嵌入Word2.1.1 加载项嵌入 Word2.1.2 宏录制嵌入 Word 2.2 嵌入 WPS2.2.1 加载项嵌入 WPS2.2.2 宏录制嵌入 WPS 2.3 嵌入时报错解…...

Linux之which和find
...
MySQL 常规操作指南
1. 连接MySQL服务器 (1)通过命令行连接 mysql -u username -p在提示下输入对应用户的密码,即可进入MySQL命令行界面。 (2)指定数据库连接 mysql -u username -p -D database_name这里会直接连接到名为database_nam…...

Rocketmq rust版本-开篇
我是蚂蚁背大象(Apache EventMesh PMC&Committer),文章对你有帮助给Rocketmq-rust star,关注我GitHub:mxsm,文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com Rust重构Rocketmq,大家好我是mxsm(Apache EventMesh PMC&Comm…...
springboot3+springsecurity6集成druid启动报错
环境:springboot3security6druid1.2.20 druid1.2.20这个版本开始支持springboot3自动配置,不再需要手动引入 依赖为 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId>…...

golang面试题大全
go基础类 1、与其他语言相比,使用 Go 有什么好处? 与其他作为学术实验开始的语言不同, Go 代码的设计是务实的。每个功能和语法决策都旨在让程序员的生活更轻松。Golang 针对并发进行了优化,并且在规模上运行良好。由于单一的标…...

Google 在裁员的路上一路狂奔
早上刷新闻,Google 在 2024 开年还没几天就宣布了今年的裁员计划。 前几天还在说我们当地的大学为了削减预算而进行裁员。 大厂谷歌却是首当其冲,裁员1000多人,涉及了核心工程、谷歌助理、Pixel手机等硬件团队的人员。 截至2023年9月30日&…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...