網路播放器的補充 (轉)

worldblog發表於2007-12-09
網路播放器的補充 (轉)[@more@]

這篇主要是補充關於資料處理部分的。
由於有些朋友和我討論了這些問題,確實也是個問題。所以我測試後,統一整理給大家看看。
因為我的工程也要嵌入部分。所以我自己寫了些程式碼後,才知道和從中直接讀有些不同。檔案的讀寫快,可是網路的資料要求等待的。不是很及時。特別是處理頭資訊時。因為我做的是MPEG2的,他處理頭資訊要1M多,如果while等待話。。。累死了—*%·—#……·#
下面介紹一下MEMFILE的例子的處理頭資訊的詳細情況。
1。首先,不論是MPEG2還是MPEG1的,他都要讀32768位元組。這是用來判斷資料格式的。
2。其次,如果判斷的正確(和你所給的型別一致),對於MPEG1在讀32768,然後在讀32768,這些資料可以是檔案中間的資料。
對於MPEG2格式的,他要讀1M多,然後在讀幾百K的資料。這些資料也可以從檔案中間開始。
或是時時的資料流資料也行。也就是說這些資料是和判斷無關的。這樣大家就應該知道怎麼做了...

3。最後,就是穩定的讀資料了。MPEG1的是32768,MPEG2的是1638。然後我在以前說了如何修改MPEG1格式的資料大小。不過只能該成2的N次方。不過要求修改基類。
在下面我會說明一個更簡單的更改方法。而且可以是任意的大小(只能小於預設的)。不過還是說完這部分吧。

所以說,開始的32768是個關鍵資料,如果它不能夠透過它判斷出資訊的話,它會接著讀32768資料。一直讀下去,直到它正確的判斷了資料格式。
結論:開始時給個正確的資料吧。
改進:由於他會不斷的判斷(不知道MPEG1是不是,我測試的是MPEG2,大家可以自己測測),所以,你可以在開始也不是正確的資料!(正是由於這個原因,大家可以擺脫頭資訊的捆擾了,實在是太...嘿嘿)只要你給的資料有個包是正確的。那麼它就會接著2。的步驟開始向下執行了。
不過由於我測試的是MPEG2格式的MEDIASUBTYPE_MPEG2_TRANSPORT和MEDIASUBTYPE_MPEG2_PROGRAM,他們本來就是基於流的,所以我不是很肯定MPEG1的是不是這樣。是不是一定需要的是個頭資訊。(我本來想測試的可是我的測試...555~~~~去哪了,天哪,什麼時候刪的...)又想讓大家快點見到,所以沒有測試了。望做MPEG1的自己試試。
上面說完了開始的資料處理。下面就要說3步驟的技巧了。這個也解決了while阻塞執行緒的問題了。一舉兩得。
我剛才說了資料可以是任意的大小,現在就說明一下。只能小於預設的,應該可以是大於,可是你願意麼?
原來Read是可以提前返回的!!!不需要資料的返回。象下面的程式碼:
*pdwBytesRead = 0;
return S_OK;
這樣你就不要給資料了。不過第一個資料不能返回0。否則會OVER的。
然後,因為很多人的資料包的大小是自己定的,如果你的資料沒有達到他要求的32768或是1638,就是沒有匹配,怎麼辦呢?那麼你複製你要求的大小的資料給pbBuffer,然後,你返回你自己的大小就OK。象下面的程式碼:

CopyMemory( (PVOID)pbBuffer,(PVOID)(m_pbData + m_head),
 MY_SOCK_SIZE);
*pdwBytesRead = MY_SOCK_SIZE;
return S_OK;

大家覺的怎麼樣??還不趕快試試!GO!
至於測試的程式碼...哎,我也想給啊。—#*%……·#%·
看來大家還是自己寫寫吧。如果你原來就改寫過的話,應該是很簡單的。程式碼就幾句而已。祝大家好運!節日快樂!!

afterain 9.28

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990219/,如需轉載,請註明出處,否則將追究法律責任。

相關文章