專案需要使用ffmpeg來實現flv格式的編譯碼功能。ffmpeg對編譯碼大致分兩部分來實現:資料編碼和檔案編碼,直接呼叫相關api就可以實現。然而不夠靈活,需要自己定製flv格式,於是就把檔案編碼這一部分自己來做,加入自己的東西。資料的編碼直接使用ffmpeg的api。解碼的時候根據由自己來分析格式,抽取純音訊資料,進行解碼。
每個tag分為header和data兩個區。tag header 固定的是11個位元組,tag型別(1byte)、data大小(3bytes)、timestamp(3bytes)、extimestamp擴充套件時間戳,作為時間戳的高位(1byte)和stramid(3bytes恒為0).。後面緊跟著是tag data ,開頭1byte標示 出該tag data的一些音訊資訊,例如編碼型別、通道數等。在tag data後面還有乙個4bytes的區域表示該tag的size。據此可以看出,每個tag的size是不固定的,取決於tag data的大小。但是tag的header和data第乙個byte以及後面的previous的大小和值是固定的。除了header中的data大小、timestamp和previous size的值。
下面就是純音訊資料的編碼了。我們的原始資料都是未經壓縮的pcm資料,**可以是音效卡,也可以是檔案和網路流。拿到的pcm資料,要先進行分割,確定乙個包的大小。先找到所使用的編碼器的壓縮比是多少,這個一般是常數。在ffmpeg的decoder例項中可以找到。據此計算出編碼後的資料的大小,為方便讀取,盡量把包分割成相同大小。然後把這個值+1寫進tagheader的datasize區,當然previoussize的大小也可以確定了。至於時間戳,知道取樣率,那麼也就很容易計算出來了。例如壓縮比是8:1。原始資料512編碼之後就是64,那麼就65就是tagdata的大小,不要忘了前面的1byte的音訊資訊。
要注意一點,在實際的編碼中,可能會出現快取不足導致丟包的現象,這時候會出現時間戳錯誤,導致不同步。
自己動手寫bootloader
原始出處 作者資訊和本宣告。否則將追究法律責任。為了寫乙個bootloader讓板子跑起來,首先我們要知道bootloader是個什麼東東才行。簡單的說,bootloader就是乙個引導核心啟動的一段小 也就是說當啟動完核心之後,它的使命就已經結束。bootloader生命週期 初始化硬體 設定啟動...
自己動手寫CMS
簡易的cms外掛程式,可供借鑑或者擴充套件 流程 定義內容 分類與組織內容 儲存內容 操作控制內容 定義內容 制定目標 確定需要的內容型別 目標使用者定位 確定目標使用者需要何種技術 分類與組織內容 按內容所屬的邏輯層級關係來劃分 按內容的種類來劃分,比如video text audio等等 儲存內...
自己動手寫快取Version1
實現乙個最簡單最基本的快取系統。using system using system.data using system.configuration using system.web using system.collections using system.text using system.thr...