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類的一個屬性,所以不用帶括弧。
