• 沒有找到結果。

第五章 實驗結果

5.2 實驗數據

下表5.2 的實驗數據是呈現存放影音資料 data buffer 的變化,以及所讀取的 影音資料大小和資料型態為何。其中tk->p_buffer 指標是指向存放影音資料的 data buffer 起始位址,i_off 表示為從 data buffer 讀取影音資料後的偏移量,一開始 i_off 是設定為0,peek 指標是指向 tk->p_buffer[i_off]的位址,packet size 表示從 data buffer 讀取影音資料的大小。

進行第一次解多工程序時,由peek 指標指向 tk->p_buffer[i_off]的位址,然後 比對peek[0-3]這四個位元組正好為 pack start code 0x000001ba,並且計算出此 pack

header 的長度為 14 個 bytes,最後再從 data buffer 中讀取 14bytes;等到進行第二 次進行解多工程序時,一樣是由peek 指向 tk->p_buffer[i_off]的位址,而此時 i_off 的值已經變成14,然後比對 peek[0-3]這四個位元組正好為 system header

0x000001bb,並計算出此 system header 的長度為 18 個 bytes,最後再從 buffer 中 讀取18bytes。

Address of data NO

.

i_off

&tk->p_buffer[i_off] peek

peek[0-3] packet size (byte)

1 0 04E90020 04E90020 0x000001ba 14

2 14 04E9002E 04E9002E 0x000001bb 18 3 32 04E90040 04E90040 0x000001bc 24 4 56 04E90058 04E90058 0x000001e0 1288 35 18018 04E94682 04E94682 0x000001c0 328 36 18346 04E947CA 04E947CA 0x000001e0 1265 37 19611 04E94CBB 04E94CBB 0x000001c0 327 38 19938 04E94E02 04E94E02 0x000001e0 43

… … … … … …

表5.2:data buffer 的變化

下表5.2 的實驗數據是呈現每次從 data buffer 所讀取的影音資料存放的位 置。p_pkt 指標是指向一個 block 的起始位址,而 p_pkt->i_buffer 表示為存放在 block 內的資料 buffer 大小,p_pkt->p_buffer 表示讀取影音資料後所存放的起始位

址。所以我們可以很清楚的看到每一個block 內所存放的資料大小和資料位址,

以及屬於何種資料型態。

NO .

p_pkt p_pkt->

i_buffer

1 011066B8 14 01106730 0x000001ba pack header 2 01156F28 18 01156FA0 0x000001bb system header 3 01156F28 24 01156FA0 0x000001bc PSM 4 0115C598 1288 0115C610 0x000001e0 Video PES 5 010EFE98 37 010EFF10 0x000001e0 Video PES 6 01159A38 327 01159AB0 0x000001c0 Audio PES 7 01158B18 328 01158B90 0x000001c0 Audio PES 8 01152128 43 011521A0 0x000001e0 Video PES 9 01158D08 327 01158D80 0x000001c0 Audio PES 10 010F0088 43 010F0100 0x000001e0 Video PES 11 01151F38 328 01151FB0 0x000001c0 Audio PES 12 011743A8 37 01174420 0x000001e0 Video PES 13 0117B708 327 0117B780 0x000001c0 Audio PES

… … … … … …

34 011066B8 14 01106730 0x000001ba pack header 35 0117AD80 328 0117AE00 0x000001c0 Audio PES 36 0124E6B0 1265 0124E730 0x000001e0 Video PES 37 01182E70 327 01182EF0 0x000001c0 Audio PES 38 010F0088 43 010F0100 0x000001e0 Video PES

… … … … … …

表5.3:block 資料狀態

下表5.3 是呈現解析之後的 audio block 以及 video block,與上表 5.3 比較可 以看到資料的大小以及存放資料的起始位址都已經改變了。因為音訊位元流及視 訊位元流是存放在PES payload,所以經過解析之後,block 內存放資料的 buffer 就只剩下PES payload 的部份,而已經不包含 PES header,。最後會將這些 block 分別串聯成一個audio 鏈結串列以及 video 鏈結串列。

NO .

p_pkt p_pkt->

i_buffer

p_pkt->p_buffer Data type

(byte)

1 0115C598 1269 0115C623 Video PES payload 2 010EFE98 28 010EFF19 Video PES payload 3 01159A38 313 01159ABE Audio PES payload 4 01158B18 314 01158B9E Audio PES payload 5 01152128 29 011521AE Video PES payload 6 01158D08 313 01158D8E Audio PES payload 7 010F0088 29 010F010E Video PES payload 8 01151F38 314 01151FBE Audio PES payload 9 011743A8 28 01174429 Video PES payload 10 0117B708 313 0117B78E Audio PES payload 11 0117C418 314 0117C49E Audio PES payload 12 0117C608 1130 0117C68E Video PES payload 13 0117E038 313 0117E0BE Audio PES payload 14 0117E228 1251 0117E2AE Video PES payload 15 0117E7C8 314 0117E84E Audio PES payload

… … … … …

表5.4:解析完 block 之後的資料變化

下面表5.4 是呈現 video 鏈結串列的情況,其中 p_pkt-> p_next 指標是指向下 一個block 的位址,而由 p_pkt->p_buffer 前面 4 個位元組皆為

0x000001b3(sequence_header_code)或 0x00000100(picture_start_code),由 ISO/IEC 13818-2 文件可以知道圖片的訊息是包含在這些 start code 的後面,因此每一個 block 的 buffer 所存放的就是一張圖片的訊息。所以假設在進行影像的解碼程序 時,就會先從這個video 鏈結串列取出第ㄧ個 video block 並由解碼函數對這個 video block 進行解碼程序,解碼完之後,再從 video 鏈結串列取出第二個 block 來進行解碼,所以會一直不斷的依照順序取出block 來進行解碼。

NO .

p_pkt p_pkt-> p_next p_pkt->

i_buffer

1 0115C598 010EFE98 1269 0115C623 0x000001b3

2 010EFE98 01152128 28 010EFF19 0x00000100 3 01152128 010F0088 29 011521AE 0x00000100 4 010F0088 011743A8 29 010F010E 0x00000100 5 011743A8 0117C608 28 01174429 0x00000100 6 0117C608 0117E228 1130 0117C68E 0x00000100 7 0117E228 0117E9B8 1251 0117E2AE 0x00000100

… … … … …

17 01250E30 01251988 2721 01250EB9 0x000001b3 18 01251988 012520E8 1704 01251A0E 0x00000100 19 012520E8 01252588 1002 0125216E 0x00000100 20 01252588 01251988 3128 01252609 0x00000100

… … … … …

表5.5:video 鏈結串列

第六章 結論

從本論文的討論中了解一個媒體播放器整個運作流程基本上包含解多工、解 碼、輸出這三大部分,而這三個部分也是播放器的運作核心,並且包含著許多領 域的知識。例如在進行解多工程序時,如何將影音資料解多工為audio bistream 以及video bistream,以及將這些 audio bistream 以及 video bistream 解碼成圖片以 及聲音,這都需要各種影音的壓縮解碼技術知識。

現今的媒體播放器大都強調具有強大的解碼功能以及能夠解析各種影音檔案 格式,也因為這個原因造成播放器所面臨的問題,就是如何在眾多的解多工器以 及解碼器中找到合適的解多工器以及解碼器,所以每個播放器對於解多工器與解 碼器的選擇都應該有一套機制存在,避免錯誤的產生。

所以從本論文所研究的VLC 媒體播放器中發現 VLC 將許多功能模組化,並 且設計了一套尋找模組的機制可以因應不同的功能找出合適的模組,也因此能夠 針對不同的的影音檔案格式以及編碼格式,可以尋找出合適的解多工器模組以及 解碼器模組來進行解多工以及解碼的程序。

參考文獻

[1] http://www.videolan.org/vlc/

[2] http://www.tldp.org/REF/VLC-User-Guide/

[3] http://www.videolan.org/developers/vlc/doc/developer/html/manual.html [4] http://wiki.videolan.org/VideoLAN

[5] ISO/IEC 13818-1 Generic coding of moving picture and associated audio information: system

[6] ISO/IEC 13818-2 Generic coding of moving picture and associated audio information: Video

[7] http://en.wikipedia.org/wiki/Vlc

[8] 陳瑩甄,『串流伺服器資料解析及封包包裝』,國立交通大學,碩士論文,

96 學年度。

附錄

如果想要build vlc from source code on windows,大致上有下列三個的方法:

1. 使用 cygwin(在 windowns 下 compile,建議用此方法)。

2. 使用 MSYS+MINGW。

3. 使用 Microsoft Visual C++。

在這邊我們只介紹如何用cygwin 去 building soutce code of vlc。

編譯步驟:

1. 到http://www.cygwin.com/ 下載cygwin.exe,執行並安裝所有packgae.

2. 到http://www.videolan.org/ 下載vlc source code,解壓縮至C:

目錄底下。

\cygwin\home\kyo

3. 到http://download.videolan.org/pub/testing/win32/ ,下載

contrib-20061202-win32-bin-gcc-3.4.5-only.tar.bz2 並解壓縮之後,將資料夾裡 的win32 資料夾複製到C:\cygwin\usr目錄底下。

4. 開啟 UltraEdit(或筆記本),儲存下列文字到 vlc source code 的資料夾裡(檔名 存為configure-vlc.sh)

CONTRIB_TREE=/usr/win32

PATH=${CONTRIB_TREE}/bin:$PATH \ ./bootstrap && \

CPPFLAGS="-I${CONTRIB_TREE}/include -I${CONTRIB_TREE}/include/ebml" \ LDFLAGS=-L${CONTRIB_TREE}/lib \

PKG_CONFIG_LIBDIR=${CONTRIB_TREE}/lib/pkgconfig \ CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin" \

./configure \

--host=i686-pc-mingw32 \

--enable-sdl --with-sdl-config-path=${CONTRIB_TREE}/bin --disable-gtk \ --enable-nls \

--enable-ffmpeg --with-ffmpeg-mp3lame --with-ffmpeg-faac \ --with-ffmpeg-zlib --enable-faad --enable-flac --enable-theora \ --with-wx-config-path=${CONTRIB_TREE}/bin \

--with-freetype-config-path=${CONTRIB_TREE}/bin \ --with-fribidi-config-path=${CONTRIB_TREE}/bin \

--enable-live555 --with-live555-tree=${CONTRIB_TREE}/live.com \ --enable-caca --with-caca-config-path=${CONTRIB_TREE}/bin \ --with-xml2-config-path=${CONTRIB_TREE}/bin \

--with-dvdnav-config-path=${CONTRIB_TREE}/bin \ --disable-cddax --disable-vcdx --enable-goom \ --enable-twolame --enable-dvdread \

cd vlc.0.8.6c

6. 輸入下列指令後按 enter:

dos2unix configure-vlc.sh 7. 輸入下列指令後按 enter:

./configure-vlc.sh

8. 執行下列指令後按 enter:

make

9. 成功 compile vlc source code,並產生 vlc.exe 執行檔。

10. *Creating self contained packages:(optional)

Once the compilation is done, you can either run VLC directly from the source tree or you can build self-contained VLC packages with the following "make"

commands:

make package-win32-base

(This will create a subdirectory named vlc-x.x.x with all the binaries "stripped"

without any debugging symbols).

make package-win32-zip

(Same as above but will package the directory in a zip file).

make package-win32

(Same as above but will also create an auto-installer package. You will need to have NSIS installed in its default location for this to work).

(註)*步驟 10 選擇性執行

相關文件