[C/C++] AVI Audio/Video Extractor
- AVI Audio/Video Extractor
- RIFF
- AVI Main Header
- AVI Stream Header
- Bitmap Info Header
- Wave FormatEx
- movi
- Index
- Demo
- Discussion
- 無index區塊的處理
- JUNK區塊對齊
- OpenDML標準格式支援
- 字幕處理
- 其他影音壓縮格式支援
- ....
- Reference
Download: AviAVExtractor.zip
AVI Audio/Video Extractor是兩年前為了了解基本的影音架構處理而撰寫的小程式,最近終於有時間將這個小程式做些微的修正發佈出來。整個程式演算沒有什麼難度,只是大量的使用結構與檔案的輸入輸出的處理。基本的AVI結構圖如下:
上面這張概略圖已經不是最原始的AVI架構,我參照了OpenDML標準定義所混和繪製的。
本範例程式最原先版本是參照微軟的AVI RIFF File Reference文件定義所撰寫的,網址如下;
http://msdn.microsoft.com/en-us/library/ms779636(VS.85).aspx
AVI屬於RIFF(Resource Interchange File Format)標準定義內的格式,所以在圖上你可以看到一開始會有12bytes為RIFF的資訊(如右圖),每一個區塊佔用4bytes,第一個區塊紀錄著RIFF這四個字元,第二個區塊則是紀錄這整個檔案的大小,例如圖中的16進位數值轉為10進位就是13044728 bytes,會比實際檔案大小少於8 bytes,因為13044728是不包含檔案前8個bytes。第三個區塊則是紀錄著此檔案的類型。同樣的紀錄方式應用在WAVE檔也是如此。RIFF是由Microsfot跟IBM所定義的,詳細訊息可以參考wikipedia - Resource Interchange File Format
緊接著RIFF之後就是AVI結構裡第一個主LIST區塊(標頭定義區塊),在avih識別字之後會有一個AVI Main Header,在這個範例裡我們僅使用他來判別此檔案有多少個串流(dwStreams),詳細的結構資料你可以參考微軟的AVI Main Header。
讀取完AVI Main Header之後緊接著是第一個子LIST,一個AVI檔通常會有2~4個sub-list,而Audio跟Video通常都在前兩個sub-list裡,而其餘的則是紀錄字幕或者一些保留資訊。在這個範例裡我們只藉由Stream Header來判斷目前此串流的格式(fccType),詳細結構你可以參考微軟的AVI Stream Headers。
每一個子LIST區塊都會有AVI Stream Header,紀錄著此串流的類型。以第一張的AVI架構圖來說,我們假設stream0為vids(也就是視訊串流),那這時就要讀取點陣圖的標頭檔,在這個範例裡我們只將此訊息儲存保留至視訊分離時使用,詳細結構請參考微軟的Bitmap Info Header。
讀取完視頻的標頭資訊之後,stream1則是為音頻標頭資訊,範例裡我們使用標準的wave格式標頭檔WAVEFORMETEX來讀取,同樣的也是保留原始資訊作為之後分離音訊使用,詳細結構請參考微軟的WAVEFORMETEX
讀取完第一部份的主LIST,第二部份的LIST則是紀錄著音訊視訊的實體資料,以某一區塊的已壓縮視訊區塊為例,如下:
第一個識別字00dc代表著stream0的已壓縮視訊資料,另外還有00db(stream0未壓縮視訊),以及01wb(stream1的音訊區塊),所以前面兩個字元00/01代表著串流的位置,二後兩個字元dc/db/wb則是串流的類型,詳細資料可以參考微軟的AVI RIFF File Reference
Index在AVI格式裡是optional的,但是在這個範例程式裡必須仰賴有index的AVI才能正常處理,index內每一個entry定義如下:
struct AVIOLDINDEX_ENTRY{
DWORD dwChunkId;
DWORD dwFlags;
DWORD dwOffset;
DWORD dwSize;
};
除了dwFlags在這個範例我們沒有用到之外,其餘的變數我們必須依照index的數據來搜尋實體資料。dwChunkId決定所紀錄區塊的串流類型,dwOffset則是紀錄此區塊的位置(不一定是絕對位置,所以在設計時必須自行修正這個問題),dwSize則是此區塊的大小,詳細資訊請參考微軟的AVIOLDINDEX
使用GCC4.2.4在ubuntu8.04底下編譯之後會產生AviAVExtractor這個檔案,使用方式如下(以附件所附的imagine.avi檔案為例):
處理完後音訊跟視訊的檔案分別為audio0.wav, video0.avi。
原始碼只有三個:
AviDefinition.h : AVI and its related structure definition
AviAVExtractor.h : header for AviAvExtractor.h
AviAVExtractor.c : Main Program
其中我將一些常用的AVI結構定義在AviDefinition.h裡面,為了程式設計方便,我所定義的結構可能會跟微軟上所列的有些出入。
本程式僅是簡單展示如何做音訊視訊分離,仍有許多地方並未實做:
所以還有很多地方可以繼續補強,當然如果你是要做一些影音處理的專案,為了效率還是直接使用現成的API會比較快且穩定。
[Windows] SmitfraudFix
- SmitfraudFix
一段時間沒使用windows系統之後,處理中毒問題的能力就下降許多,這裡推薦一個清除malware的小工具-SmitfraudFix,官方頁面如下:
http://siri.geekstogo.com/SmitfraudFix.php
程式很小,下載回去依照畫面指示清除即可。
SiRi將一些清除病毒的例行工作寫在SmitfraudFix程式裡,節省了自行一一清除的時間,想要了解更多的安全軟體資訊可以參考他的blog.
[UTips.58] DosBox
- DosBox
Dosbox除了讓較新的windows系統可以執行dos程式之外,也可以讓linux系統藉由這個模擬器來執行dos的軟體,安裝方式如下:
安裝完後會在Applications->Games找到DOSBox emulator,打開之後使用方式如下:
其他/xxx是你要掛載的檔案路徑。
[C/C++] id3lib
- id3lib
Download: id3_test.zip
id3lib也是一個跨平台的ID3資訊編輯的API,當初我原本想藉由此API來設計一個多功能的ID3編輯器,後來發現網路上早已有許多現成的好用工具,因此就罷。官方網頁如下:
http://id3lib.sourceforge.net/
編譯方式如下:
預設library安裝路徑如下:
在程式開發編譯過程時如果出現undefined reference to 'compress' and 'uncompress'這類問題時,請在makefile載入下面的library
這裡我還是提供一個Linux下的簡易的範例,主要程式碼是由id3lib裡的範例複製過來的。
範例執行畫面如下:
[C/C++] IrrKlang
- IrrKlang
Download: IrrKlang_test.zip
IrrKlang是一套跨平台的Sound API,在程式開發過程中如果需要載入音效的功能倒是可以考慮使用這個API。IrrKlang還有Pro版是給商業用途的開發者,需要付費。官方頁面如下:
http://www.ambiera.com/irrklang/index.html
下載完解壓縮即可使用,不需自行編譯libary。支援.Net, Linux, Mingw等開發平台,只需將對應的library和include複製到你的開發環境上即可呼叫使用,相關說明文件已經包含在官方的下載包裡。
我提供的下載範例是適用於Linux的系統,裡面只有簡單的讀取音樂播放的範例,由於音樂檔案較大,我就沒有附上了。
[SQL] MySQL++
- MySQL++
Download : MySQL_linux.zip
MySQL++是一套跨平台的C++與MySQL互通的API,下載頁面如下:
http://tangentsoft.net/mysql++/
編譯方式如下,跟一般的程式編譯沒有兩樣:
編譯完後的libary跟include的路徑如下:
除此之外你還需要連結mysql的inlcude:
編譯程式時你還需要以下的library:
mysqlclient
下載範例裡是使用MySQL預設的資料庫(mysql)內的資料表(help_keyword)。mysql相關程式安裝可以參考這一篇[UTips. 52] Apache, PHP, MySQL, phpMyAdmin。
執行範例畫面如下:
[ANN] Fast Artificial Neural Network (FANN)
- Fast Artificial Neural Network (FANN)
- 編譯
FANN是一個基於BackPropagation的Neural Network API,其中還包含了quickprop和RPROP (Resilient backpropagation ) 。對於初學卻又不想寫程式的人來說這個API可以幫你節省許多時間,但是話說過來,如果您真的想要使用neural network設計程式,到頭來還是多要自己寫。
官方頁面如下:
Reference Manual:
http://leenissen.dk/fann/html/files/fann-h.html
下載頁面如下:
For Linux:
編譯完後的library會在/usr/local/lib裡,可以參考這一篇[UTips. 57] Shared Libary Path來設定library的路徑,或者直接寫在makefile裡面。
我利用FANN API簡單寫了一個範例如下:
Download: FANN_linux.zip
範例畫面:
[UTips. 57] Shared Libary Path
- shared Library Path
常常要編譯程式卻老是忘記shared library的編輯位置,這裡做個簡單的紀錄。
在ubuntu底下要編輯下面的檔案:
編輯完後執行下面的指令即可:
[ANN] Probabilistic Neural Network
- Probabilistic Neural Network
- Table for XOR Probelm
- Architecture for XOR Problem
- 網路計算公式
- 範例輸出畫面
Download: Probabilistic.c
機率神經網路(Probabilistic Neural Network)是由D.F.Specht於1988年所發表的,此網路是基於貝氏分類器(Bayesian Classifier)所設計出來的,固然機率神經網路比較適合應用在分類問題上。其優點是採一次學習,運算速度極快,但是缺點是隱藏層裡的節點數會受訓練範例所影響,在處理較複雜的問題時所需的記憶空間就會比其他類型的神經網路大了許多。
XOR輸入輸出分類表格如上
依照上面的表格所設計的架構
輸入層:2個nodes (對應到兩個輸入)。
隱藏層:4個nodes(對應到4個訓練範例)。
輸出層:2個nodes(對應到兩種輸出可能性)。
網路加權值初始化:
Whi: inputs到hidden nodes的weights值
Who: hidden nodes 到 output nodes的weight值
跟之前的網路架構不一樣的是他們的初始值是由訓練範例而定。
sigma是平滑曲度,這裡設定為 1。
網路計算公式:
隱藏節點計算公式
加總各output的weight值:
計算output:
最後設定最大輸出值為1,其餘為0(這個範例裡只有兩個輸出,所以其中為1,另一則為0):
這裡我只是介紹最簡易的Probabilistic Neural Network的簡單應用,改良後的PNN(MPNN)能分類的問題就不僅如此了。
Orange - data analysis tool
Installation pip install orange3 Run orange python -m Orange.canvas
-
Socket Connection 節錄自筆者的Network Programming其中的資料,一般在Windows底下如果要寫網路程式多半會想到Microsoft MFC提供的相關API,而Linux底下則多使用Unix Socket來實現,這裡筆者要簡短的介紹如何使用最基礎...
-
system("pause") for linux 在windows底下如果不想藉由開發工具做debug時,筆者我多數使用system("pause")這個指令,但是一到了linux之後,這個指令完全無效,因為linux的termainl底...
-
Calling Gnuplot in C Download: callGnuPlot.c 懶惰是程式設計師的天性,所以才會創造出許多方便的程式,最近一直需要作圖分析,厭倦了Origin重複且繁複的設定,所以決定將要分析的資料使用c做分析後再由gnuplot畫出。 熟悉gnuplo...