雙路錄像利用靜态變量做多對象之間簡單寫互斥
筆者目前在研的項目是基于android6.0的智能後視鏡産品,目前存在前視錄像跟後視錄像的功能,存儲的檔案路徑都是保持到外部的同一張SD卡上的。我們都有一個這樣的經驗:比如往SD卡拷檔案,比如2個檔案都是50M,先拷貝第一個50M檔案完成後,再拷貝另外一個50M的檔案,這樣拷貝這2個總共100M檔案花費的時間比會先拷貝一個50M檔案,在還沒有完成拷貝第一個檔案的時候就複制拷貝第二個50M的檔案到SD卡上等它完成拷貝花費的總時間要少。:
/*****************************************************************************************************/
聲明:本博内容均由http://blog.csdn.net/edsam49原創,轉載請注明出處,謝謝!
因為都有這樣的體驗,确實兩個任務在操作同一個卡的時候,總是需要一些協調管理的開銷,還會造成寫不連續配置設定簇的問題;那跟我們雙路錄像有什麼關系呢,理論上也是一樣的,兩個任務會操作同一個SD卡,從效率上看,把兩個任務協調成一個任務肯定是更好的效率、性能。
兩個不同的任務實際上是兩個不同的對象,但是又是同一個類的,因為都要封裝成一樣的視訊格式,是以寫卡就在封裝格式完成後的接收對象裡面。可能很多人會說,在這兩個任務裡面有很多方法來把他們互相開,理論上确實是這樣。做二次開發,很多時候還得看原廠提供的大架構,改動太大出問題了原廠還不一定支援你,另外真改動太大了耗費的人力物力也大,我們想以較小的代價來實作這個功能。
筆者前視錄像的碼率固定在6M,後視固定在2.2M左右,是以按照編碼緩存達到2M閥值後一次寫入2M,效率确實會好很多,但是難免會出現兩個任務同時寫的時候。通過分析,前視的每一次寫之間的間隔在2.6~2.8秒之間,後視的在7秒左右,這樣留給我們的操作空間就是很大的。
首先我們來看一個列印,筆者加了一個靜态變量【cun】,列印如下
從列印上,存在兩個fd,一個是65一個是83,這是兩個不同的檔案句柄,跟随兩個對象裡列印出的cun變量确實是線性增長的。那麼機會就來了,可以使用這個靜态變量來做簡單互斥。
大概思路是這樣的,在寫之前都判斷一下【cun】是不是為0,如果是0,那就說明還沒有人寫,那就可以立馬先把【cun】置一,然後再寫,因為筆者使用的是class10的卡,是以2M的寫入基本在200ms之内就解決了;是以筆者就定了一個能相容兩個人任務的時間緩沖,也就是保障一個任務完全寫完成後才開始另外一個寫任務。考慮到了這一點,實施起來就簡單了,筆者想得比較簡單一點,就是在寫閥值稍微調大一點,在将觸發老閥值2M的時候先判斷一下是否有任務寫,如果有就把閥值臨時調大一點,緩存會繼續接受編碼資料,得到達到新閥值的時候,先前的那個寫任務早就完成了。這樣就可以岔開這個寫動作,這個修改從總的來說,改善還是蠻多的。另外還得考慮一下,下次萬一還是沒寫完的情況,也得做一個強制啟動寫,不能一直這樣緩存下去。考慮問題還是盡量要閉環思維。
這個思路套路不深,淺顯易懂。筆者通過批量機器試驗,證明還是行之有效的。