forlength需要缓存吗
⑴ 为什么for的那两行是循环遍历数组中的每个元素,两个length是什么意思,求解释。
经过我思考,你要遍历二维数组,还可以用以下办法:
package HXY;
public class Q {
public static void main(String[] args) {
int[][] a=new int[3][4];
for(int[] m:a){
for(int n:m){
System.out.println(n);
}
}
}
}
⑵ AAC音频编码 相关的原理和设置
AAC(Advanced Audio Coding),中文名:高级 音频 编码 ,出现于1997年,基于 MPEG-2 的音频编码技术。由Fraunhofer IIS、 杜比实验室 、 AT&T 、 Sony 等公司共同开发,目的是取代 MP3 格式。2000年, MPEG-4 标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。
iOS平台支持AAC编码器,主要使用AudioToolbox中的AudioConverter API。之所以做AAC编码器是因为在做一个HLS的功能,HLS要求的TS文件,需要视频采用H264编码,音频采用AAC编码。H264可以使用硬件或软件编码器,前面已经介绍。AAC也可以使用硬件或者软件编码,iOS全都支持。
首先需要创建一个Converter,也就是一个AAC Encoder,使用如下接口:
extern OSStatus
AudioConverterNew( const AudioStreamBasicDescription* inSourceFormat,
const AudioStreamBasicDescription* inDestinationFormat,
AudioConverterRef* outAudioConverter) __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0);
输入参数分别是源和目的的数据格式。
在AAC编码的场景下,源格式就是采集到的PCM数据,目的格式就是AAC。
AudioStreamBasicDescription inAudioStreamBasicDescription;
// FillOutASBDForLPCM()
inAudioStreamBasicDescription.mFormatID = kAudioFormatLinearPCM;
inAudioStreamBasicDescription.mSampleRate = 44100;
inAudioStreamBasicDescription.mBitsPerChannel = 16;
inAudioStreamBasicDescription.mFramesPerPacket = 1;
inAudioStreamBasicDescription.mBytesPerFrame = 2;
inAudioStreamBasicDescription.mBytesPerPacket = inAudioStreamBasicDescription.mBytesPerFrame * inAudioStreamBasicDescription.mFramesPerPacket;
inAudioStreamBasicDescription.mChannelsPerFrame = 1;
inAudioStreamBasicDescription.mFormatFlags = kLinearPCMFormatFlagIsPacked | | ;
inAudioStreamBasicDescription.mReserved = 0;
AudioStreamBasicDescription = {0}; // Always initialize the fields of a new audio stream basic description structure to zero, as shown here: ...
.mChannelsPerFrame = 1;
.mFormatID = kAudioFormatMPEG4AAC;
UInt32 size = sizeof();
AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &size, &);
OSStatus status = AudioConverterNew(&inAudioStreamBasicDescription, &, &_audioConverter);
if(status != 0) {NSLog(@"setup converter failed: %d", (int)status);}
这样就创建了AAC编码器,默认情况下,Apple会创建一个硬件编码器,如果硬件不可用,会创建软件编码器。
经过我的测试,硬件AAC编码器的编码时延很高,需要buffer大约2秒的数据才会开始编码。而软件编码器的编码时延就是正常的,只要喂给1024个样点,就会开始编码。
那么如何在创建的时候指定使用软件编码器呢?需要用到下面的接口:
- (AudioClassDescription *):(UInt32)type
fromManufacturer:(UInt32)manufacturer
{
static AudioClassDescription desc;
UInt32 encoderSpecifier = type;
OSStatus st;
UInt32 size;
st = AudioFormatGetPropertyInfo(kAudioFormatProperty_Encoders,
sizeof(encoderSpecifier),
&encoderSpecifier,
&size);
if (st) {
NSLog(@"error getting audio format propery info: %d", (int)(st));
return nil;
}
unsigned int count = size / sizeof(AudioClassDescription);
AudioClassDescription descriptions[count];
st = AudioFormatGetProperty(kAudioFormatProperty_Encoders,
sizeof(encoderSpecifier),
&encoderSpecifier,
&size,
descriptions);
if (st) {
NSLog(@"error getting audio format propery: %d", (int)(st));
return nil;
}
for (unsigned int i = 0; i < count; i++) {
if ((type == descriptions[i].mSubType) &&
(manufacturer == descriptions[i].mManufacturer)) {
memcpy(&desc, &(descriptions[i]), sizeof(desc));
return &desc;
}
}
return nil;
}
AudioClassDescription *desc = [self :kAudioFormatMPEG4AAC
fromManufacturer:];
OSStatus status = AudioConverterNewSpecific(&inAudioStreamBasicDescription, &, 1, desc, &_audioConverter);
如果要正确的编码,编码码率参数是必须设置的。否则编码时会返回560226676错误码(!dat)。
UInt32 ulBitRate = 64000;
UInt32 ulSize = sizeof(ulBitRate);
status = AudioConverterSetProperty(_audioConverter, kAudioConverterEncodeBitRate, ulSize, &ulBitRate);
需要注意,AAC并不是随便的码率都可以支持。比如如果PCM采样率是44100KHz,那么码率可以设置64000bps,如果是16K,可以设置为32000bps。
创建完成Converter和设置完Bitrate之后,可以查询一下最大编码输出的大小,后续会用到。
UInt32 value = 0;
size = sizeof(value);
AudioConverterGetProperty(_audioConverter, , &size, &value);
获取出来的Value表示编码器最大输出的包大小。
然后调用进行编码:
AudioBufferList outAudioBufferList = {0};
outAudioBufferList.mNumberBuffers = 1;
outAudioBufferList.mBuffers[0].mNumberChannels = 1;
outAudioBufferList.mBuffers[0].mDataByteSize = value;//value是上面查询到的值
outAudioBufferList.mBuffers[0].mData = new int8[value];
UInt32 ioOutputDataPacketSize = 1;
status = (_audioConverter, inInputDataProc, (__bridge void *)(self), &ioOutputDataPacketSize, &outAudioBufferList, NULL);
编码接口中,inInputDataProc是一个输入数据的回调函数。用来喂PCM数据给Converter,ioOutputDataPacketSize为1表示编码产生1帧数据即返回。outAudioBufferList用来存放编码后的数据。
inInputDataProc中的处理如下:
static OSStatus inInputDataProc(AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets, AudioBufferList *ioData, AudioStreamPacketDescription **outDataPacketDescription, void *inUserData)
{
AACEncoder *encoder = (__bridge AACEncoder *)(inUserData);
UInt32 requestedPackets = *ioNumberDataPackets;
uint8_t *buffer;
uint32_t bufferLength = requestedPackets * 2;
uint32_t bufferRead;
bufferRead = [encoder.pcmPool readBuffer:&buffer withLength:bufferLength];
if (bufferRead == 0) {
*ioNumberDataPackets = 0;
return -1;
}
ioData->mBuffers[0].mData = buffer;
ioData->mBuffers[0].mDataByteSize = bufferRead;
ioData->mNumberBuffers = 1;
ioData->mBuffers[0].mNumberChannels = 1;
*ioNumberDataPackets = bufferRead >> 1;
return noErr;
}
pcmPool是一个用于存放PCM数据的环形缓冲区。
因为采集输入每次不一定有1024样点,所以可以将数据缓存起来,再满足1024样点时再调用编码。
另外,对于TS文件来说,每个AAC数据需要增加一个adts头,adts头是一个7bit的数据,通过adts可以得知AAC数据的编码参数,方便解码器进行解码。
adts头的计算方法如下:
- (NSData*) adtsDataForPacketLength:(NSUInteger)packetLength {
int adtsLength = 7;
char *packet = (char *)malloc(sizeof(char) * adtsLength);
// Variables Recycled by addADTStoPacket
int profile = 2; //AAC LC
//39=MediaCodecInfo.CodecProfileLevel.AACObjectELD;
int freqIdx = 8; //16KHz
int chanCfg = 1; //MPEG-4 Audio Channel Configuration. 1 Channel front-center
NSUInteger fullLength = adtsLength + packetLength;
// fill in ADTS data
packet[0] = (char)0xFF; // 11111111 = syncword
packet[1] = (char)0xF9; // 1111 1 00 1 = syncword MPEG-2 Layer CRC
packet[2] = (char)(((profile-1)<<6) + (freqIdx<<2) +(chanCfg>>2));
packet[3] = (char)(((chanCfg&3)<<6) + (fullLength>>11));
packet[4] = (char)((fullLength&0x7FF) >> 3);
packet[5] = (char)(((fullLength&7)<<5) + 0x1F);
packet[6] = (char)0xFC;
NSData *data = [NSData dataWithBytesNoCopy:packet length:adtsLength freeWhenDone:YES];
return data;
}
⑶ thinkphp 数据缓存是否校验缓存是什么意思
在ThinkPHP中进行缓存操作,一般情况下并不需要直接操作缓存类,因为系统内置对缓存操作进行了封装,直接采用S方法即可,例如:
缓存初始化
// 缓存初始化
S(array('type'=>'xcache','expire'=>60));
缓存初始化可以支持的参数根据不同的缓存方式有所区别,常用的参数是:
参数 描述
expire 缓存有效期(时间为秒)
prefix 缓存标识前缀
type 缓存类型
系统目前已经支持的缓存类型包括:Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache。
如果S方法不传入type参数初始化的话,则读取配置文件中设置的DATA_CACHE_TYPE参数值作为默认类型。同样的道理,prefix参数如果没有传入会读取配置文件的DATA_CACHE_PREFIX参数值,expire参数没有传入则读取DATA_CACHE_TIME配置值作为默认。
有些缓存方式会有一些自身特殊的参数,例如Memcache缓存,还需要配置其他的参数:
S(array(
'type'=>'memcache',
'host'=>'192.168.1.10',
'port'=>'11211',
'prefix'=>'think',
'expire'=>60)
);
对于全局的缓存方式,一般我们建议添加prefix(缓存前缀)参数用以区分不同的应用,以免混淆。
缓存设置
// 设置缓存
S('name',$value);
会按照缓存初始化时候的参数进行缓存数据,也可以在缓存设置的时候改变参数,例如:
// 缓存数据300秒
S('name',$value,300);
甚至改变之前的缓存方式或者更多的参数:
// 采用文件方式缓存数据300秒
S('name',$value,array('type'=>'file','expire'=>300));
如果你在缓存设置的时候采用上面的数组方式传入参数的话,会影响到后面的缓存存取。
缓存读取
// 读取缓存
$value = S('name');
缓存读取的是前面缓存设置的值,这个值会受缓存初始化或者缓存设置的时候传入的参数影响。 如果缓存标识不存在或者已经过期,则返回false,否则返回缓存值。
缓存删除
// 删除缓存
S('name',null);
删除缓存标识为name的缓存数据。
对象方式操作缓存
我们可以采用对象方式操作缓存,例如:
// 初始化缓存
$cache = S(array('type'=>'xcache','prefix'=>'think','expire'=>600));
$cache->name = 'value'; // 设置缓存
$value = $cache->name; // 获取缓存
unset($cache->name); // 删除缓存
如果你设置了缓存前缀的话,对应的缓存操作只是对应该缓存前缀标识的,不会影响其他的缓存。
关于文件缓存方式的安全机制
如果你使用的是文件方式的缓存机制,那么可以设置DATA_CACHE_KEY参数,避免缓存文件名被猜测到,例如:
'DATA_CACHE_KEY'=>'think'
缓存队列
数据缓存可以支持缓存队列,简单的说就是可以限制缓存的数量,只需要在初始化的时候指定length参数:
S(array('type'=>'xcache','length'=>100,'expire'=>60));
设置了length参数后,系统只会缓存最近的100条缓存数据。
⑷ Mac需要清理缓存吗
如果您的mac的磁盘空间不够用的话可以尝试清理一下缓存。
一般来讲缓存是用来加速的,而很少会拖慢您电脑的速度,带来的副作用只是占用磁盘空间。当然了占用得太多让你的电脑没地方做虚拟内存了那倒是可能会造成不良影响。
所以一般没必要清理,清理的话可能是为了保护自己的隐私更多一些。如果觉电脑速度慢,清理缓存一般也不会有什么很大的作用。
⑸ 用C语言编一个函数能比较字符串,并返回其中的长字符串
char*longer_string(char*s1,char*s2)
{
returnstrlen(s1)>=strlen(s2)?s1:s2;
}
⑹ b站观看时长排行如何去除
b站全站排行刷新去掉观看 原创
2018-04-26 11:09:00
lz1694439208
码龄8年
关注
使用方法 放到控制台运行然后
全站动画国创相关音乐舞蹈游戏科技生活鬼畜时尚娱乐影视【去掉看过】
看之前点击这个去掉看过 就会自动去掉上一次看过的排名
建议用 油猴写个扩展
源码
var list = JSON.parse(localStorage.getItem("IdLists"));
for (n in list) {
ids.push(list[n].id);
}
if (list == null ) {
list = [];
}
[].forEach.call($(".info").find('a:first'), function(a) {
var id = a.attributes["href"].value.split("/")[4];
var name = a.text;
if (ids.indexOf(id) == -1) {
list.push({
id: id,
name: name
});
}else{
a.parentNode.parentNode.parentNode.remove();
}
})
localStorage.setItem("IdLists", JSON.stringify(list));
文章知识点与官方知识档案匹配
java技能树首页概览
92728 人正在系统学习中
打开CSDN APP,看更多技术内容
基于 Localstorage 设计一个 1M 的缓存系统,需要实现缓存淘汰机制,提供设计思路
//1.再每次存储之前,获取已存储的localStorage数据数组和大小 //2.判断未超过1024kb,则对数组插入新数据后存储 //3.判断已超过1024kb,则先删除数组的首条数据后,再插入新数据存储 functionSetData(key,value){ varobj=window.localStorage; varsize=0; for(iteminobj){ if...
继续访问
几道高级前端面试题解析
为什么 0.1 + 0.2 != 0.3,请详述理由 因为 JS 采用 IEEE 754 双精度版本(64位),并且只要采用 IEEE 754 的语言都有该问题。 我们都知道计算机表示十进制是采用二进制表示的,所以 0.1 在二进制表示为 // (0011) 表示循环 0.1 = 2^-4 * 1.10011(0011) 复制代码那么如何得到这个二进制的呢,我们可以来演算下 小数算二进...
继续访问
封装H5的localStorage本地缓存对象,实现缓存有效期、缓存条数限制
声明方式: /* * indexKey 缓存名 * cacheSize 缓存个数 */ var localCache = new LRUCache(indexKey, cacheSize); 调用方式: 添加:localCache.put(key, value, expires); 获取: localCache.get(key); 清除:localCache.clea
继续访问
如何使用 sessionStorage 和 localStorage 进行简单的数据存储与获取
如何使用 sessionStorage 和 localStorage 进行简单的数据存储与获取 localStorage和sessionStorage是Web提供的两种本地存储方式。 相比较cookie而言,localStorage和sessionStorage的存储大小很大,localStorage能够长期保存,sessionStorage在会话期间保存。 localStorage 1 . 设置 localStorage (setItem): var localStorage = window
继续访问
localStorage && sessionStorage 存储/缓存数据
localStorage存储 我们通过以下方式将数据储存到localStorage中 window.localStorage.setItem('key',value) 但有时value为一个对象Object,以上面的方式写入,会出现读取的返回值为{object Object}的情况,但这并不是我们想要的,此时我们需要使用新的方式 传入Object window.localStorage.setI...
继续访问
基于大数据量的缓存查询实现方案
业务、应用系统最常用的就是基于数据的查询,这不同于宏观意义上的系统各个层面优化(应用端、服务端、DB端等等),基于数据的查询更多时候需要考虑数据的规模、用户的习惯、数据的变化性等因素,但同时数据查询的优化也贯穿着系统的各个层面。本文主要针对一个特定领域进行分析,以供各位参考! 基于数据的查询往往首要考虑的是缓存数据,那么缓存的前提: 1、数据不会实时变化
继续访问
localstorage存储大小_JavaScript浏览器端数据存储方案之IndexDB篇
在做项目的过程中,我们经常遇到需要把信息存储在本地的情况,比如权限验证的token、用户信息、埋点计数、客户配置的皮肤信息或语言种类等,我们可以暂存一下避免浏览器不必要的请求和客户多余操作,给客户使用带来方便。随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据。现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的大...
继续访问
使用localstorage实现的本地缓存,但是如何根据用户访问不同的缓存数据?
比如说用户A登录,保存了数据,此时用户B在同一浏览器登录,如何保证B访问不到a的缓存? 解决方法:自己存数据的时候一起将用户的信息存入(例如用户的ID) 一般是用户登录的时候使用localStorage缓存下用户信息userId(例如是用户的ID) 当A用户登录后使用localStorage缓存下数据dataInfo时,要把用户的ID同时加入缓存的数据中 dataInfo = { list: ...
继续访问
三大缓存技术--localStorage、sessionStorage、Cookie
前端三大缓存技术、客户端存储、cookie、localStorage、sessionStorage、三者的区别
继续访问
数据存储之localStorage与sessionStorage
1. 两者的区别 1.1生命周期 localStorage生命周期是永久,当用户将显示在浏览器上提供的UI清除localStorage信息,否则将永远存在。 sessionStorage生命周期为当前窗口或者标签页,当窗口或者标签页被永久关闭了,那么sessionStorage存储的数据也会被清空。 1.2存储方式 localstorage(本地存储)则以文件的方式存储在本地,永久保存(不主动删除,则一直存在);sessionstorage( 会话存储 ) ,临时保存。localStorage和sessio
继续访问
浏览器缓存库设计总结(localStorage/indexedDB)
前言浏览器缓存设计一直是web性能优化中非常重要的一个环节,也是SPA应用盛行的今天不得不考虑的问题.作为一名优秀的前端工程师,为了让我们的应用更流畅,...
继续访问
设置缓存的大小
目录 1 CacheManager级别 2 Cache级别 3 大小衡量 4 配置大小示例 缓存大小的限制可以设置在CacheManager上,也可以设置在单个的Cache上。我们可以设置缓存使用内存的大小,也可以设置缓存使用磁盘的大小,但是使用堆内存的大小是必须设置的,其它可设可不设,默认不设就是无限制。在设置缓存大小的时候,我们可以设置缓存使用某一个存储器的最大字节数,也可以设置缓存在某一个存储器上最多存放元素的数量。 1 C...
继续访问
黑科技:LocalStorage 缓存机制
黑科技:LocalStorage 缓存机制 事情的起因是我的同事金果问我:- “你知道微信公众号文章的渲染方式吗?” 对此,我的反应是:- “啊?” 金果继续问:- “控制台的 Network 里没有发生任何请求,文章里的内容是怎么来的?” 说到这儿我好像大概理解她的意思,于是打开控制台的 Network 确认一下果真如此,文章中的内容并...
继续访问
热门推荐 localStorage用法小总结
一、什么是localStorage 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k) 二、localStorage的优势和局限 【1】优势 localStorage拓展了cookie的4K限制 localStorage会可以...
继续访问
前端页面利用localStorage设置缓存方案
前端页面利用localStorage设置缓存方案 localStorage的存储空间大致在5M左右,各大浏览器略有差别。我再chrome 54中测试能放下 5233962 字节,该值并不精确,通过每次往localStorage中插入一个大字符串,到达上线报错之后再取总长度得到。 LocalStorageClient类提供两个方法来存储缓存数据save(key, data, flag) saveAss
继续访问
小程序从启动到发版
小程序项目从拿到手到发版流程
继续访问
最新发布 MongoDB总结
MongoDB总结
继续访问
JsonUtility读写json简单应用
使用Unity提供的JsonUtility 简单封装了一个将数据以json格式存储到本地,方便数据读写的案例
继续访问
✿✿✿JavaScript --- Ajax异步请求与JSONP 跨域请求
一、原生的Ajax请求1.异步和同步2.Ajax介绍(1)原生的JS实现方式(了解)(2)原生AJax发送Post请求,并携带请求参数 二、JQuery封装后的Ajax1.JQeury实现方式三、JSONP 跨域请求1.什么是跨域?2.JQuery 封装过后的JSONP请求四、CORS 跨域,获取不到数据的原因。五、Java中JSON字符串和Java对象的互相转换2.Java对象转换JSON3. JSON转为Java对象
继续访问
⑺ java的for循环中获取字符串长度或者数字长度用length时为什么后边不用跟小括号
带括号的,大部分指方法。length只是继承Object类的一个属性,所以不用带括号。
