扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
您好,当然苹果官方有提供使用方法及代码库供您阅读
站在用户的角度思考问题,与客户深入沟通,找到兴山网站设计与兴山网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站建设、成都网站制作、企业官网、英文网站、手机端网站、网站推广、申请域名、网页空间、企业邮箱。业务覆盖兴山地区。
CGAffineTransformTranslate来自苹果官方
这些方法如果您需要的话,可以背下来
如果新方法出现了,那么会提供在苹果额官方文档中供您阅读,对于新方法来说,苹果会提供使用指南和方法介绍供您阅读的
是的,如您所想,这些方法的发展一定是遵循某种规律的,但是很不幸,这些规律没人能掌握,这是因为苹果官方并非一人编写新方法,而也许是数十人上百人在共同编写,大家只能遵照一种标准去编写,而对于我们开发者来说,阅读最新的官方文档或者用科学上网搜索一些外网论坛才能获得最新的东西,而中文的用法则是一些先锋者理解后翻译出来造福给他人的
请您不要沮丧,这并非是您某些环节的知识缺失了,方法是固定的,您只需要了解并掌握,能够在自己编写时知道并使用即可,您不必知道它是从哪里来的,您只需要知道这个方法能用来做什么就可以了
最简单的查找代码的方式就是您按住command键,再用鼠标点击您要了解的方法,就会进入该方法声明的界面,这个界面中提供了一个简单的注释告诉您是如何使用
如您需要查找的CGAffineTransformTranslate方法
Translate在英文中是转化、翻译的意思,在这里做转化之意,注释的意思是以参数t(一个CGAffineTransform类型的变量)做参照通过tx和ty来进行控件的偏移,当然这段注释晦涩难懂,因此如果您想要查看详细的解释,您可以选中这一行,点击上方菜单栏的help,选择Search Documentation for Selected Text选项,那么您就会进入APPLE的开发者手册和方法介绍了
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,现在由Michael Niedermayer维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;
libavcodec:用于各种类型声音/图像编解码;
libavutil:包含一些公共的工具函数;
libswscale:用于视频场景比例缩放、色彩映射转换;
libpostproc:用于后期效果处理;
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
ffsever:一个 HTTP 多媒体即时广播串流服务器;
ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;
三种帧的说明
I帧:帧内编码帧 ,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
I帧特点:
1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
2.解码时仅用I帧的数据就可重构完整图像;
3.I帧描述了图像背景和运动主体的详情;
4.I帧不需要参考其他画面而生成;
5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
7.I帧不需要考虑运动矢量;
8.I帧所占数据的信息量比较大。
P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。
P帧特点:
1.P帧是I帧后面相隔1~2帧的编码帧;
2.P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
3.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
6.由于P帧是参考帧,它可能造成解码错误的扩散;
7.由于是差值传送,P帧的压缩比较高。
B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。
B帧的预测与重构
B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。
B帧特点
1.B帧是由前面的I或P帧和后面的P帧来进行预测的;
2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
3.B帧是双向预测编码帧;
4.B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;
5.B帧不是参考帧,不会造成解码错误的扩散。
注:I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧。一般来说,I帧的压缩率是7(跟JPG差不多),P帧是20,B帧可以达到50。可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。
1.分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多。
2.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
3.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
4.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。帧内(Intraframe)压缩也称为空间压缩(Spatial compression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码jpeg差不多。
帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩(Temporal compression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值(Frame differencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。
顺便说下有损(Lossy )压缩和无损(Lossy less)压缩。无损压缩也即压缩前和解压缩后的数据完全一致。多数的无损压缩都采用RLE行程编码算法。有损压缩意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复。几乎所有高压缩的算法都采用有损压缩,这样才能达到低数据率的目标。丢失的数据率与压缩比有关,压缩比越小,丢失的数据越多,解压缩后的效果一般越差。此外,某些有损压缩算法采用多次重复压缩的方式,这样还会引起额外的数据丢失。
如果NALU对应的Slice为一帧的开始,则用4字节表示,即0x00000001;否则用3字节表示,0x000001。
NAL Header:forbidden_bit,nal_reference_bit(优先级)2bit,nal_unit_type(类型)5bit。 标识NAL单元中的RBSP数据类型,其中,nal_unit_type为1, 2, 3, 4, 5的NAL单元称为VCL的NAL单元,其他类型的NAL单元为非VCL的NAL单元。
0:未规定
1:非IDR图像中不采用数据划分的片段
2:非IDR图像中A类数据划分片段
3:非IDR图像中B类数据划分片段
4:非IDR图像中C类数据划分片段
5:IDR图像的片段
6:补充增强信息(SEI)
7:序列参数集(SPS)
8:图像参数集(PPS)
9:分割符
10:序列结束符
11:流结束符
12:填充数据
13:序列参数集扩展
14:带前缀的NAL单元
15:子序列参数集
16 – 18:保留
19:不采用数据划分的辅助编码图像片段
20:编码片段扩展
21 – 23:保留
24 – 31:未规定
H.264的SPS和PPS串,包含了初始化H.264解码器所需要的信息参数,包括编码所用的profile,level,图像的宽和高,deblock滤波器等。
码率:256~512 kb/s
帧率:15~20fps
分辨率:1280x720(HD) 640x368(VGA) 1920x1080(UHD)
中文名:高级音频编码,出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、ATT、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。
优点:相对于mp3,AAC格式的音质更佳,文件更小。
不足:AAC属于有损压缩的格式,与时下流行的APE、FLAC等无损格式相比音质存在“本质上”的差距。加之,传输速度更快的USB3.0和16G以上大容量MP3正在加速普及,也使得AAC头上“小巧”的光环不复存在了。
音频采样率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。在当今的主流采集卡上,采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级,22.05KHz只能达到FM广播的声音品质,44.1KHz则是理论上的CD音质界限,48KHz则更加精确一些。
比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送数据速度越快。声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标。 视频中的比特率(码率)原理与声音中的相同,都是指由模拟信号转换为数字信号后,单位时间内的二进制数据量。
信道编码中,K符号大小的信源数据块通过编码映射为N符号大小的码字,则K/N成为码率,其中假设编码前后的符号表没有变化。
FFMPEG中结构体很多。最关键的结构体可以分成以下几类:
解协议(http,rtsp,rtmp,mms)
AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)
解封装(flv,avi,rmvb,mp4)
AVFormatContext主要存储视音频封装格式中包含的信息;AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。
解码(h264,mpeg2,aac,mp3)
每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。
存数据
视频的话,每个结构一般是存一帧;音频可能有好几帧
解码前数据:AVPacket
解码后数据:AVFrame
AVCodec是存储编解码器信息的结构体
const char *name:编解码器的名字,比较短
const char *long_name:编解码器的名字,全称,比较长
enum AVMediaType type:指明了类型,是视频,音频,还是字幕
enum AVCodecID id:ID,不重复
const AVRational *supported_framerates:支持的帧率(仅视频)
const enum AVPixelFormat *pix_fmts:支持的像素格式(仅视频)
const int *supported_samplerates:支持的采样率(仅音频)
const enum AVSampleFormat *sample_fmts:支持的采样格式(仅音频)
const uint64_t channel_layouts:支持的声道数(仅音频)
int priv_data_size:私有数据的大小
1.注册所有编解码器:av_register_all();
2.声明一个AVCodec类型的指针,比如说AVCodec first_c;
3.调用av_codec_next()函数,即可获得指向链表下一个解码器的指针,循环往复可以获得所有解码器的信息。注意,如果想要获得指向第一个解码器的指针,则需要将该函数的参数设置为NULL。
这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息
如果是单纯使用libavcodec,这部分信息需要调用者进行初始化;如果是使用整个FFMPEG库,这部分信息在调用 av_open_input_file和av_find_stream_info的过程中根据文件的头信息及媒体流内的头部信息完成初始化。其中几个主要 域的释义如下:
extradata/extradata_size: 这个buffer中存放了解码器可能会用到的额外信息,在av_read_frame中填充。一般来说,首先,某种具体格式的demuxer在读取格式头 信息的时候会填充extradata,其次,如果demuxer没有做这个事情,比如可能在头部压根儿就没有相关的编解码信息,则相应的parser会继 续从已经解复用出来的媒体流中继续寻找。在没有找到任何额外信息的情况下,这个buffer指针为空。
time_base:
width/height:视频的宽和高。
sample_rate/channels:音频的采样率和信道数目。
sample_fmt: 音频的原始采样格式。
codec_name/codec_type/codec_id/codec_tag:编解码器的信息。
该结构体描述一个媒体流
主要域的释义如下,其中大部分域的值可以由av_open_input_file根据文件头的信息确定,缺少的信息需要通过调用av_find_stream_info读帧及软解码进一步获取:
index/id:index对应流的索引,这个数字是自动生成的,根据index可以从AVFormatContext::streams表中索引到该流;而id则是流的标识,依赖于具体的容器格式。比如对于MPEG TS格式,id就是pid。
time_base:流的时间基准,是一个实数,该流中媒体数据的pts和dts都将以这个时间基准为粒度。通常,使用av_rescale/av_rescale_q可以实现不同时间基准的转换。
start_time:流的起始时间,以流的时间基准为单位,通常是该流中第一个帧的pts。
duration:流的总时间,以流的时间基准为单位。
need_parsing:对该流parsing过程的控制域。
nb_frames:流内的帧数目。
r_frame_rate/framerate/avg_frame_rate:帧率相关。
codec:指向该流对应的AVCodecContext结构,调用av_open_input_file时生成。
parser:指向该流对应的AVCodecParserContext结构,调用av_find_stream_info时生成。
这个结构体描述了一个媒体文件或媒体流的构成和基本信息
这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象。其中:nb_streams和streams所表示的AVStream结构指针数组包含了所有内嵌媒体流的描述;iformat和oformat指向对应的demuxer和muxer指针;pb则指向一个控制底层数据读写的ByteIOContext结构。
start_time和duration是从streams数组的各个AVStream中推断出的多媒体文件的起始时间和长度,以微妙为单位。
通常,这个结构由av_open_input_file在内部创建并以缺省值初始化部分成员。但是,如果调用者希望自己创建该结构,则需要显式为该结构的一些成员置缺省值——如果没有缺省值的话,会导致之后的动作产生异常。以下成员需要被关注:
probesize
mux_rate
packet_size
flags
max_analyze_duration
key
max_index_size
max_picture_buffer
max_delay
AVPacket定义在avcodec.h中
FFMPEG使用AVPacket来暂存解复用之后、解码之前的媒体数据(一个音/视频帧、一个字幕包等)及附加信息(解码时间戳、显示时间戳、时长等)。其中:
dts 表示解码时间戳,pts表示显示时间戳,它们的单位是所属媒体流的时间基准。
stream_index 给出所属媒体流的索引;
data 为数据缓冲区指针,size为长度;
duration 为数据的时长,也是以所属媒体流的时间基准为单位;
pos 表示该数据在媒体流中的字节偏移量;
destruct 为用于释放数据缓冲区的函数指针;
flags 为标志域,其中,最低为置1表示该数据是一个关键帧。
AVPacket 结构本身只是个容器,它使用data成员指向实际的数据缓冲区,这个缓冲区可以通过av_new_packet创建,可以通过 av_dup_packet 拷贝,也可以由FFMPEG的API产生(如av_read_frame),使用之后需要通过调用av_free_packet释放。
av_free_packet调用的是结构体本身的destruct函数,它的值有两种情况:(1)av_destruct_packet_nofree或 0;(2)av_destruct_packet,其中,前者仅仅是将data和size的值清0而已,后者才会真正地释放缓冲区。FFMPEG内部使用 AVPacket结构建立缓冲区装载数据,同时提供destruct函数,如果FFMPEG打算自己维护缓冲区,则将destruct设为 av_destruct_packet_nofree,用户调用av_free_packet清理缓冲区时并不能够将其释放;如果FFMPEG不会再使用 该缓冲区,则将destruct设为av_destruct_packet,表示它能够被释放。对于缓冲区不能够被释放的AVPackt,用户在使用之前 最好调用av_dup_packet进行缓冲区的克隆,将其转化为缓冲区能够被释放的AVPacket,以免对缓冲区的不当占用造成异常错误。而 av_dup_packet会为destruct指针为av_destruct_packet_nofree的AVPacket新建一个缓冲区,然后将原 缓冲区的数据拷贝至新缓冲区,置data的值为新缓冲区的地址,同时设destruct指针为av_destruct_packet。
构体保存的是解码后和原始的音视频信息。AVFrame通过函数av_frame_alloc()初始化,该函数仅仅分配AVFrame实例本身,而没有分配其内部的缓存。AVFrame实例由av_frame_free()释放;AVFrame实例通常分配一次,重复使用,如分配一个AVFrame实例来保留解码器中输出的视频帧(此时应在恰当的时候使用av_frame_unref()清理参考帧并将AVFrame归零)。该类所描述的数据通常由AVBuffer的API来保存一个引用计数,并保存于AVFrame.buf
/AVFrame.extended_buf,在至少存在一个参考的时候(如AVFrame.buf[0] != NULL),则该对象被标记为“被引用”。在此情况下,AVFrame所包含的每一组数据必须包含于AVFrame的缓存中。
ADTS流 跟Raw流,
1.ADTS是个啥
ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式。
AAC解码器都需要把AAC的ES流打包成ADTS的格式,一般是在AAC ES流前添加7个字节的ADTS header。也就是说你可以吧ADTS这个头看作是AAC的frameheader。
ffmpeg写 mp4+aac时呢,音频有两个值得注意的地方。
1 写aac音频时,要添加两个字节的信息到AVCodecContext.
2 ffmpeg 写AAC音频数据不能含有ADTS头
在AAC ES流前添加7个字节的ADTS header。也就是说你可以吧ADTS这个头看作是AAC的frameheader。
tvOS必须要支持 bitcode. (iOS bitcode项可选的) 所以在编译的时候Makefile要加上 CFLAGS= -fembed-bitcode 。 如果用xcode编译lib,要在Build Settings—custom compiler flags —cflags 加上OTHER_CFLAGS="-fembed-bitcode" 。
1 内存优化。内存往上涨。没能及时回收。最好能够使用手动管理内存。
解码优化,看ffmpeg文档,最新的解码库,解码效率,稳定性,综合性考虑。
YUV-RGB OpenGLES shader来显示。
1.分离视频音频流
ffmpeg -i input_file -vcodec copy -an output_file_video//分离视频流
ffmpeg -i input_file -acodec copy -vn output_file_audio//分离音频流
2.视频解复用
ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264
ffmpeg –i test.avi –vcodec copy –an –f m4v test.264
3.视频转码
ffmpeg –i test.mp4 –vcodec h264 –s 352 278 –an –f m4v test.264 //转码为码流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352 278 –an –f m4v test.264 //转码为码流原始文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //转码为封装文件
//-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制
4.视频封装
ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file
5.视频剪切
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取图片
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪切视频
//-r 提取图像的频率,-ss 开始时间,-t 持续时间
6.视频录制
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi
7.YUV序列播放
ffplay -f rawvideo -video_size 1920x1080 input.yuv
8.YUV序列转AVI
ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi
触动精灵脚本开发手册
目录
前言
学习前的准备
越狱及 root 常识
Lua 基础简明教程
脚本开发取色技巧
小白学触动零基础视频教程
触动精灵开发者指南
触动产品功能对比
如何查看更多文档
脚本开发相关工具
触动精灵 iOS
脚本编辑器:TouchSprite Studio
抓色器:TSColorPicker
已兼容的模拟器
点击触摸
函数:touchDown、touchUp、touchMove 触摸点击、滑动
函数:catchTouchPoint 获取用户点击坐标
图色类及屏幕相关
函数:init 初始化
函数:getDeviceOrient 获取手机、应用屏幕方向(仅支持 iOS)
函数:setDeviceOrient 设置屏幕方向(仅支持 iOS)
函数:getScreenSize 获取屏幕分辨率
函数:setScreenScale 坐标缩放
函数:keepScreen 保持屏幕
函数:getColor、getColorRGB 获取屏幕某点颜色值
函数:findColorInRegionFuzzy 区域模糊找色
函数:findImageInRegionFuzzy 区域模糊找图
函数:findMultiColorInRegionFuzzy 区域多点找色
函数:findMultiColorInRegionFuzzyExt 高级区域多点找色
函数:findImage 高级区域找图(仅支持 iOS)
函数:snapshot 截图
函数:imageOperMerge 图片合并(仅支持 iOS)
开发辅助类
函数:initLog、wLog、closeLog 日志函数
函数:sysLog 系统日志
函数:nLog 远程日志
脚本控制
函数:mSleep 延时
函数:lua_exit 退出脚本
函数:lua_restart 重载脚本
函数:luaExitIfCall 来电暂停
函数:checkScriptAuth 脚本授权
系统相关
函数:dialog 提示框
函数:toast 提示
函数:dialogRet 带按钮的对话框
函数:dialogInput 参数对话框(仅支持 iOS)
函数:getNetTime 获取网络时间
函数:addContactToAB 添加联系人
函数:removeAllContactsFromAB 清空通讯录
UTF-8 编码
模块说明
函数:utf8.char 整数序列转换字符串
函数:utf8.codes 获取字符编码
函数:utf8.codepoint 获取指定位置字符编码
函数:utf8.len 统计字符个数
函数:utf8.offset 获取字符位置
文字输入及按键模拟
函数:inputText 输入字符串
函数:switchTSInputMethod 切换到触动/帮你玩输入法(仅支持 Android)
函数:getInPutMethod 获取当前输入法包名(仅支持 Android)
函数:pressHomeKey 模拟主屏幕按键
函数:doublePressHomeKey 双击 HOME 键(仅支持 iOS)
函数:keyDown、keyUp 模拟键盘(仅支持 iOS)
应用相关
函数:runApp、closeApp 运行、关闭应用
函数:isFrontApp 判断前台应用
函数:frontAppBid 获取前台应用
函数:appBundlePath 获取应用安装路径
函数:appDataPath 获取应用数据路径(仅支持 iOS)
函数:appIsRunning 检测应用是否运行
函数:openURL 打开网络地址
函数:ipaInstall、ipaUninstall 安装、卸载应用(仅支持 iOS)
函数:install, uninstallApp 安装、卸载应用程序(仅支持 Android)
函数:getInstalledApps 获取应用列表
函数:isInstalledApk 查询应用程序是否安装(仅支持 Android)
函数:changeSpeed 变速器(仅支持 iOS)
函数:cleanApp 清理应用数据(仅支持 Android)
系统信息类
函数:getDeviceType 获取设备类型
函数:getDeviceID 获取触动精灵设备号
函数:getMemoryInfo 获取设备内存信息
函数:getTSVer、getOSVer 获取引擎版本号、获取系统版本号
函数:getOSType 获取设备系统
函数:batteryStatus 检测电池状态、电量
函数:getProcess 获取设备进程列表
函数:getDeviceAlias 获取设备别名(仅支持 iOS 企业版)
函数:getDeviceName 获取设备名称
函数:setDeviceName 设置设备名称(仅支持 iOS)
函数:getIMEI 获取设备 IMEI(仅支持 Android)
函数:getNetworkIP 获取网络 IP(仅支持 Android)
函数:getDeviceBrand 获取设备品牌(仅支持 Android)
函数:getDeviceModel 获取设备型号(仅支持 Android)
函数:getCPUType 获取 CPU 型号(仅支持 Android)
函数:getUUID 获取 UUID(仅支持 Android)
函数:getSDCardPath 获取 SD 卡路径(仅支持 Android)
函数:getDPI 获取屏幕 DPI 和像素密度(仅支持 Android)
系统控制
函数:setRotationLockEnable 锁定设备方向(仅支持 iOS)
函数:setWifiEnable 无线开关
函数:setBTEnable 蓝牙开关
函数:setAirplaneMode 飞行模式开关
函数:getVPNStatus 获取VPN状态
函数:setVPNEnable VPN 开关(仅支持 iOS)
函数:setCellularDataEnable 蜂窝网络开关(仅支持 iOS)
函数:setAssistiveTouchEnable 小圆点开关(仅支持 iOS)
函数:setReduceMotionEnable 减弱动效开关(仅支持 iOS)
函数:getBacklightLevel 获取屏幕亮度触动精灵复制文本里指定的一段文字
函数:setBacklightLevel 设置屏幕亮度
函数:setVolumeLevel 设置设备音量
函数:vibrator 手机振动
函数:playAudiostopAudio 播放音频、停止播放
函数:lockDevice 锁定设备
函数:deviceIsLock 设备锁定状态
函数:unlockDevice 解锁设备
函数:setAutoLockTime 设置锁屏时间
函数:resetIDLETimer 重置锁屏计时(仅支持 iOS)
函数:shakeDevice 摇一摇(仅支持 iOS)
函数:setScreenResolution 修改分辨率(仅支持 iOS)
函数:clearKeyChain 清除钥匙串(仅支持 iOS)
函数:fakeGPS 伪装位置(仅支持 iOS)
函数:saveImageToAlbum 图片存入相册
函数:saveVideoToAlbum 视频存入相册(仅支持 iOS)
函数:writePasteboard、readPasteboard 读写剪贴板
回调函数
函数:beforeUserExit 终止之前运行
文字识别
函数:ocrText 本地光学字符识别
函数:addTSOcrDict、addTSOcrDictEx、tsOcrText、tsFindText 触动点阵识别
函数:addDmOcrDict、dmOcrText、dmFindText 打码点阵识别
触动相关
函数:deviceIsAuth 获取触动精灵授权状态(仅支持 iOS)
函数:getRunningAccess 获取当前脚本运行权限(仅支持 Android)
函数:userPath 获取客户端文件路径
函数:whoAmI 检测触动产品类型
函数:showFloatButton 显示、隐藏悬浮条
Thread 协程(仅支持 iOS)
函数:thread.create 创建协程
函数:thread.createSubThread 创建子协程
函数:thread.stop 停止协程队列
函数:thread.wait 阻塞等待当前协程完成
函数:thread.setTimeout 设置协程超时时间
函数:thread.clearTimeout 清除协程超时时间
函数:thread.waitAllThreadExit 协程阻塞等待
浮动窗口
函数:fwShowWnd 显示浮动窗口
函数:fwShowTextView 显示文字视图
函数:fwShowImageView 显示图形视图
函数:fwCloseView 关闭视图
函数:fwCloseWnd 关闭窗口
函数:fwGetWndPos 获取窗口位置
函数:fwShowButton 显示一个按钮
函数:fwGetPressedButton 获取按钮点击事件
完整实例
showUI 脚本 UI
什么是 json
调用示例
用 json 创建界面
全局属性
style 界面样式
width、height 界面的宽和高
bg 指定界面的背景图片
okname、cancelname 指定底部按钮显示文字
title 界面标题
pagetype 开启多页显示模式
orient 指定 UI 界面显示方向
btnbkcolor 设置底部按钮背景色
pagenumtype 设置分页指示样式
bgcolor 设置界面背景色
config 指定UI配置保存文件名
timer 指定UI界面自动确认时间
rettype 指定返回值类型
selpage 多页模式下指定默认停留的页面
通用属性
width 控件宽度
nowrap 指定下一个控件是否换行
界面控件
标签 Label
单选框 RadioGroup
编辑框 Edit
多选框 CheckBoxGroup
下拉框 ComboBox
图片 Image
默认样式
指定控件尺寸与位置
返回值
自定义样式实例代码
webUI(仅支持 iOS)
webview.new 创建 webview
myweb1.show 显示webview
myweb1.set 改变 webview 外观
myweb1.close 关闭 webview
event.register 发送消息,传递参数
完整例子
触动精灵模拟物理按键(仅支持 Android)
为触动增加无限可能,Lua扩展库
触动精灵 TSLib 函数扩展库
函数扩展库下载
点击滑动类
颜色判断类
开发调试类
文件操作类
应用信息类
数据操作类
系统判断类
clear 清理类模块
showUI 脚本配置界面
便捷UI
触动精灵云打码扩展库
触动精灵云打码
使用方法
函数:ocr.cloudOcrText、ocr.cloudOcrReportError、ocr.version
简易 SMTP 邮件发送库
函数:mail.send
触动精灵中 "os.execute" 应用
respring 注销
poweroff 关机
reboot 重启
clearCache 清空缓存
delFile 删除文件
unzip 解压
movefile 移动文件
copyfile 复制文件
newfolder 创建文件夹
触动精灵中"io库"应用
readFile 将指定文件中的内容按行读取
getList 遍历文件
findFile 查找文件
file_exists 检测指定文件是否存在
在触动精灵中使用"LuaSocket"网络库
如何安装
httpGet请求
httpPost请求
挂载代理
以 socket 的方式访问
smtp方法发送 mail
实现获取网络时间
统计毫秒精度的时间
生成随机数
触动精灵ts.so扩展库
触动精灵苏泽扩展库
JSON 模块
FTP 模块
设备信息模块
字符串处理模块(仅支持 iOS)
HTTP 模块
PLIST 文件操作(仅支持 iOS)
POS 模块
附录
iOS 设备分辨率一览表
Lua math 库
已知与触动精灵/帮你玩/小精灵/企业版 iOS 冲突的插件列表
约定的按键编码
电话功能按键
控制类按键
基本类按键
安卓手机如何开启系统悬浮窗权限
苹果在iOS 13中加入的“深色模式”的确是一个非常好用的功能,它利用OLED屏幕在显示纯黑色时像素不发光的特点,在系统主题UI中加入了大量的黑色元素,从而使得iPhone X、iPhone XS/XS Max、iPhone 11 Pro/iPhone 11 Pro Max这几款手机在使用过程中更加省电。同时由于OLED屏幕显示黑色时亮度也非常低,所以也十分的护眼。
不过升级了iOS 13的用户应该也发现了,虽然苹果系统本身支持深色模式,自带的浏览器、Apple Music等APP也支持深色模式。但是大量的第三方APP都不支持这一模式,比如我们常用的微信、淘宝等APP,都不支持深色模式。
这主要是因为,越是我们常用的APP,在修改UI界面的时候就越是需要慎重。比如微信虽然看起来只有简单的几个功能,但其中涉及到了非常多的界面。比如朋友圈、公众号、小程序等。如何将这些界面的深色风格统一起来,很考量设计师的功底。尤其是小程序本身就是第三方企业开发的,并非微信自己在维护,这就给微信把界面统一升级到深色模式带来了更大的难度。
同样的,淘宝、支付宝、微博等常用APP,在升级深色模式时,都会遇到很多难题。而苹果的iOS 13是在今年六月份发布的,正式版则是在九月份推出,满打满算只给第三方APP留出了三个月的开发时间,这对于微信、支付宝等APP来说实在是太赶了。腾讯、阿里作为负责人的大企业,肯定是要等到微信、支付宝的深色模式没有太大问题,基本上无BUG之后,才会推送给广大用户使用。
另外,苹果已经在新的开发手册中要求第三方应用开发者尽快适配系统的深色模式,所以大家也不用着急,随着时间的退役,国内的主流APP肯定会逐渐推出和系统风格一致的深色模式的。
文|明美无限
那么,今天明美无限就继续给大家分享苹果、iPhone、iOS最新发生的那些事。
众所周知,经过了多年的等待之后,苹果终于在iOS 13中加入了深色模式,这对于手持iPhone X、iPhone XS系列和iPhone 11 Pro系列的用户来说,绝对是个不错的消息,也是大家第一时间更新系统的动力。
目前,许多用户仍在等待 Android 10 更新的同时,已有 50% 的 iPhone 用户已在使用最新的 iOS 13 移动操作系统。
首先我们要知道,iPhone屏幕分为 OLED屏幕 和 LCD屏幕。
OLED屏幕 显示的话,黑色的部分不会发光,也不会耗电,如果是一张纯黑的图片,那么基本就等于息屏一样,不会发出任何光线。
普通的LCD屏幕 则不会这样,即使是黑色的界面,像素一样会发光,和显示其他颜色一样,并不能达到省电的效果。
近日,有外媒针对这一新增的功能对手机的各个方面进行了测试,对比更新之前,该网友发现iOS 13深色模式对于设备的续航时长有着积极的作用。在此次测试中,测试人员选用了iPhone XS作为测试设备。并分别在正常模式与深色模式下,进行了同样的操作。根据测试结果显示,处于深色模式下的iPhone XS的耗电速度要比处于正常模式下的设备慢得多。在处于正常模式的设备电量耗尽关机后,处于深色模式的设备还有30%的电量。
值得注意的是,两部手机都是在被设置为200尼特亮度的情况下进行的测试,同时深色模式对采用OLED显示屏设备的电池续航影响最大,其中包括iPhone X,iPhone XS和iPhone 11 Pro,不包括iPhone XR或iPhone 11。
这也是利用了 OLED 屏幕显示黑色时不发光的特性,因此“深色模式能帮 iPhone 省电”的论调只适用于 OLED 屏幕的 iPhone X、XS、XS Max、11 Pro 和 11 Pro Max 五款机型,采用 LCD 屏幕的 iPhone 11、XR、8 等机型“省电”效果不明显。
外媒通过这次严谨的续航测试对比,认为iOS 13的黑暗模式可以有效提高OLED屏iPhone的续航能力,用户所使用的App只要都适配了黑暗模式,省电效果绝对拔群,虽然iOS和安卓的实现原理基本都一样,但苹果的生态号召力还是要比安卓强很多,iPhone X、iPhone XS系列、iPhone 11 Pro系列的用户可以马上试试黑暗模式带来的续航能力提升了。
最后再提醒一下,尽管深色模式在夜间或光线较暗下的环境下能减少对眼睛的刺激,但能否起到护眼作用目前尚未得到科学证明,苹果在官网的宣传中也仅强调「让眼睛看着舒服,又不会打扰到周围的人」。所以,要想保护眼睛,少用手机才是正解,至少在夜间使用时记得把亮度调低些。
如果你使用的是 OLED 屏幕 iPhone ,在需要电量更持久的情况下可以适时的开启深色模式,会对续航带来一定的提升,在更多第三方应用适配深色模式之后,效果会更加明显。
期待微信早日推出支持深色模式的版本更新吧。
大家平时会怎么使用深色模式?全天开启还是仅夜间开启呢?
值得一提的是,据外媒报道,近期iOS出现了新的系统BUG,为此苹果对老用户发出了警告,从11月3日开始,如果用户不将系统更新到最新版本,将影响到旧设备的GPS定位、时间和日期等功能的使用。
据了解,这一漏洞影响的设备范围包括iPhone 5及以前的机型、iPad 4及以前的机型。为了避免影响到设备的使用,苹果公司号召广大用户将手机更新至iOS10.3.4版本。而iPhone 5之前的用户,需将系统升级到iOS 9.3.6,以避免BUG的出现。如果用户错过了最后期限,那么其将可能无法通过 WiFi 接收软件更新,而需要将设备连接到安装了 iTunes 的电脑上才能更新。
而苹果公布的这些机型都是相当老的设备了,比如iPhone 4s发布于2011年10月,至今已有8年时间,如果再按照苹果要求升级到iOS 9.3.6,估计也无法很好的运行,还可能导致手机流畅度降低,被迫换机。而还在用这部分设备的果粉,估计也是拿这些老设备简单接听电话而与,GPS功能根本不会用了,时间准不准也无所谓了,所以这些设备估计果粉不想折腾了,而且在更新iOS 13系统的时候,苹果已经不允许iPhone 6系列以下的机型更新,这也可以看出这些设备已经不在苹果支持的范围。
另外还有,在更新到iOS 13.1.3和iOS 13.2 beta 3之后,某些iPhone 11和iPhone 11 Pro用户已报告“超宽带更新失败”错误。这影响了iPhone通过AirDrop发送文件的能力,因为它使用了新的U1 ultra。宽带芯片。这个问题似乎并未广泛传播,但正在各种在线论坛上进行讨论,并提供了对某些问题有用的解决方案。
可能以前从未听说过U1芯片,它可以在iPhone 11系列手机之间共享极其精确的位置数据(几厘米之内)。目前,只有AirDrop可以利用它的优势,只需将iPhone彼此对准即可进行文件传输。某些人认为这项技术令人毛骨悚然,但苹果公司承诺将推出“ 惊人的新功能 ”。
所以,这是苹果需要超越而又快速的东西。
明美无限给大家的升级建议:不推荐所有人升级这个版本。虽然解决了一些问题,但是又产生了2代AirPods连接闪退的问题。同时,不出意外的话,月底会推出iOS 13.2 正式版系统。因此,更没有必要更新这个测试版系统。
放心吧,这才多久,苹果的优势就是控制,苹果每一款商店app都适配了全面屏,安卓都适配了吗?苹果会给开发者一个期限,期限内必须适配,到期没适配就会下架,全面屏适配如此,暗黑模式也是如此
参考一下学习的内容:
第一阶段:Objective-C语言基础
OC开发介绍,熟悉Xcode开发工具,OC语言基础,OC流程控制,类的基本概念,面向对象特性,Foundation类库,OC高级用法,协议和解析。
第二阶段:iOS交互开发
基础UI控件,高级UI控件,视图控制器,可视化开发与适配,事件处理与手势,网络与数据处理。
第三阶段:iOS高级进阶、
流行技术与特效,系统框架选择。
第四阶段:HTML,CSS与javascript
PC端网站布局,HTML5+CSS3基础,WebAPP页面布局,原生javascript交互功能开发,Ajax异步交互,JQuery应用。
第五阶段:PHP与MySQL
PHP基本语法。
第六阶段:项目开发
自由锋享项目需求
投入时间和精力,以兴趣来驱动学习。不管是视频学习还是看书学习,在整个的学习过程中贯穿着代码实战。看的代码是别人的,动手写出来的是自己的。自己动手写代码,记忆更加深刻,效率更高。分阶段的进行学习:1、看视频(零掌握,系统的学习和了解),2、看书(对编程有了一定的掌握,作为补充和提高),3、看博客帖子(取长补短)。
在学习过程中书籍资料的话看苹果的官方文档,开发手册,其他的书籍在有了一定的掌握之后,作为补充和太高来学习。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流