全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:14266
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

螢幕畫面傳輸

缺席
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-08 22:24:16 IP:219.68.xxx.xxx 未訂閱
請問,如何才能做到螢幕畫面傳輸, 且能夠在1024*768 16bit的模式下每秒傳送15張以上
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-10 22:49:06 IP:219.68.xxx.xxx 未訂閱
為什麼我發問的這個問題都沒有人回應呢 是離題,還是沒講清楚,還是太難,還是......!
HomeSound
中階會員


發表:43
回覆:177
積分:94
註冊:2002-08-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-10 23:33:39 IP:61.30.xxx.xxx 未訂閱
wu-eric您好: 基本上要傳這樣的畫面應該是?? N年後或用1G網路吧! 如果為16色那還好說,請參考包大人的 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=36068 --==多看.多學.多聽==--
------
--==多看.多學.多聽==--
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-11 07:58:30 IP:210.60.xxx.xxx 未訂閱
那沒有其它方式,如用壓縮或分割的方式來完成 如電腦教室的廣播系統(LanStar)的作法
HomeSound
中階會員


發表:43
回覆:177
積分:94
註冊:2002-08-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-11 09:34:08 IP:61.30.xxx.xxx 未訂閱
電腦教室的廣播系統有的,如VOD(視訊隨選系統), 不過是用已經壓縮好的視訊流,播放MPEG-2影片 解析度不可能是1024*768且還16bit色,光截取畫面和壓縮及傳送 就會產生延遲嚴重現象. 可以參考PcANYWHERE的傳送方式,看看它是用幾色的. 可將畫面截取後壓成高壓縮之jpg檔(或流) 再來傳輸,另一頭收取失真畫面,不過要每秒要傳送15張以上 就要試試了. 以上天馬行空,誤謬勿怪. --==多看.多學.多聽==--
------
--==多看.多學.多聽==--
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-11 21:02:02 IP:219.68.xxx.xxx 未訂閱
因為我手邊沒有 PcANYWHERE ,你知道PcANYWHERE是用幾色的嗎? 還有你知道PcANYWHERE的傳送方式嗎? 因為我不太懂 , 所以問的問題可能有點出入 , 請見諒!
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-12 10:21:51 IP:211.96.xxx.xxx 未訂閱
1024*768 = 786432 像素 16位元色階也就是說每個點二個Bytes,那一個畫面就佔用了接近1.5MB的傳輸量,一秒鐘要15個畫面,也就是一秒至少要22.5MB的傳輸能力,OK,這是一對一的情況,那一對多怎麼算?一台一個22.5MB,十台學生機就要225MB的頻寬需求,一般來講,一間教室都要50台電腦,那1.125GB跑不掉 可能有人以為100M的網路就是指一秒鐘傳輸100MB的能力吧,別忘了網路傳輸是指電子訊號BIT(高低電位),並非電腦的BYTE(字元),也就是說你的網路卡,網路線如果都是用最高級的廠牌,最高級的屏蔽鍍金線,才可能達到一秒100MBits, 1Byte=8Bits, 100MBits=12.5MBytes.....以10/100m的網路設備 純軟体的廣播環境,想達到1024*768*高彩*15fps*50台學生機的目標,恐怕是很難達到這個目的,但如果真的想做,並非不可能的任務,視頻壓縮,是一項必要的手段,還無可取代 一項簡單的思維,你在老師機上裝套Microsoft或REAL的Stream server,當然一張好的視訊擷取壓縮卡也是不可少(如果你的CPU夠快到3G,那省下來吧),如果那視訊卡不支援SCREEN CAPTURE的話,你可以把電腦的TVOUT接到那擷取卡的TVIN的口上,然後用STREAM SERVER把視訊壓縮後用UDP在區域網路上廣播,CLIENT端就直接像看網路電視廣播的方法連接到server即可 如果你不想用微軟或real的server,那就自己寫stream server唄~~~~ 藏私の禁止
orson
中階會員


發表:5
回覆:135
積分:58
註冊:2002-07-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-12 13:41:17 IP:211.74.xxx.xxx 未訂閱
引言: 請問,如何才能做到螢幕畫面傳輸, 且能夠在1024*768 16bit的模式下每秒傳送15張以上
給你一個笨答案,請上GOOGLE查一個字 VNC 這應該就是你要的。 MPEG有一個很重要的觀念就是只留下相對於前一個FRAME有更動過的部分,如果差異太大才會產生一個全新的完整的frame。 BTW,若真的是要自己研究 VNC 剛好有 source code。 Orson
poyulin
一般會員


發表:10
回覆:24
積分:6
註冊:2002-11-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-04-15 14:33:19 IP:61.218.xxx.xxx 未訂閱
目前我也在Study這個課題... 我現在發現Windows media encoder 9.0 SDK, 可以將螢幕動態擷取並播放至網路上的另一台裝有Windows media player 9.0的PC上..可以設定解析度與壓縮率等達到你的要求..但我實測後發現會有10~20秒的delay..但畫質很好且可傳聲音訊號..你可試試!
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-04-19 13:25:27 IP:163.28.xxx.xxx 未訂閱
引言: 目前我也在Study這個課題... 我現在發現Windows media encoder 9.0 SDK, 可以將螢幕動態擷取並播放至網路上的另一台裝有Windows media player 9.0的PC上..可以設定解析度與壓縮率等達到你的要求..但我實測後發現會有10~20秒的delay..但畫質很好且可傳聲音訊號..你可試試! ============================================== 可否告知 Windows media encoder 9.0 SDK 要那下載 且如何在BCB下使用
poyulin
一般會員


發表:10
回覆:24
積分:6
註冊:2002-11-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-04-19 13:38:31 IP:61.218.xxx.xxx 未訂閱
請連到下面網址: http://www.microsoft.com/downloads/details.aspx?FamilyID=000a16f5-d62b-4303-bb22-f0c0861be25b&DisplayLang=en 至於怎麼在BCB上用,我也還沒試成功..如果你先成功,請告訴我... 您也可進入討論區查閱我的問題內容 http://delphi.ktop.com.tw/link.asp?TOPIC_ID=48519
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-04-27 17:30:56 IP:211.96.xxx.xxx 未訂閱
VNC是個很好的純畫面擷取的範本,但是聲音呢?ANYWAY不管,我現在在區域網路中使用VNC,還是會有些許的殘像,反應不及的問題,似乎如果要用這種方式來做廣播教室,還有些需要改進的地方 我之前是有寫過一個利用UDP傳送畫面的程式過,被擷取畫面的機器隨時都在用一個timer擷取畫面,切割成橫豎8*8的小區塊,將每個小區塊的圖型內容(bit值,不做壓縮)做CRC32的編碼過後,放在一個array[0..63] of int64的固定陣列中,跟上回抓的64個區域CRC32值各自比對,只要不同的就代表這塊區域的畫面有變動過,再把這小塊的圖給client端就好,記得傳送之前需要將傳送的內容圖做jpeg壓縮,並加上區域編號,client端收到這個jpeg壓縮圖,只要按著區域編號,貼到相對應的坐標上即可,timer的interval值可以弄到50(1秒觸發20次) 每次動到timer就抓圖,並且切成64個tbitmap,檢查,差異的區塊丟給另一條執行緒去進行壓圖,udp做broadcast出去就行... 不過只能傳影像,聲音還是得靠stream來處理~~~~ 藏私の禁止
poyulin
一般會員


發表:10
回覆:24
積分:6
註冊:2002-11-25

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-04-27 18:36:25 IP:61.218.xxx.xxx 未訂閱
引言: VNC是個很好的純畫面擷取的範本,但是聲音呢?ANYWAY不管,我現在在區域網路中使用VNC,還是會有些許的殘像,反應不及的問題,似乎如果要用這種方式來做廣播教室,還有些需要改進的地方 我之前是有寫過一個利用UDP傳送畫面的程式過,被擷取畫面的機器隨時都在用一個timer擷取畫面,切割成橫豎8*8的小區塊,將每個小區塊的圖型內容(bit值,不做壓縮)做CRC32的編碼過後,放在一個array[0..63] of int64的固定陣列中,跟上回抓的64個區域CRC32值各自比對,只要不同的就代表這塊區域的畫面有變動過,再把這小塊的圖給client端就好,記得傳送之前需要將傳送的內容圖做jpeg壓縮,並加上區域編號,client端收到這個jpeg壓縮圖,只要按著區域編號,貼到相對應的坐標上即可,timer的interval值可以弄到50(1秒觸發20次) 每次動到timer就抓圖,並且切成64個tbitmap,檢查,差異的區塊丟給另一條執行緒去進行壓圖,udp做broadcast出去就行... 不過只能傳影像,聲音還是得靠stream來處理~~~~ 藏私の禁止
我覺得你的方法不錯, 請問你這樣做的效果如何?與VNC相較如何? 謝謝!
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-04-28 09:36:23 IP:210.60.xxx.xxx 未訂閱
引言: 我之前是有寫過一個利用UDP傳送畫面的程式過,被擷取畫面的機器隨時都在用一個timer擷取畫面,切割成橫豎8*8的小區塊,將每個小區塊的圖型內容(bit值,不做壓縮)做CRC32的編碼過後,放在一個array[0..63] of int64的固定陣列中,跟上回抓的64個區域CRC32值各自比對,只要不同的就代表這塊區域的畫面有變動過,再把這小塊的圖給client端就好,記得傳送之前需要將傳送的內容圖做jpeg壓縮,並加上區域編號,client端收到這個jpeg壓縮圖,只要按著區域編號,貼到相對應的坐標上即可,timer的interval值可以弄到50(1秒觸發20次)
poyulin兄 可否給我您那個程式的原碼來借我參考
poyulin
一般會員


發表:10
回覆:24
積分:6
註冊:2002-11-25

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-04-28 09:47:15 IP:61.218.xxx.xxx 未訂閱
引言:
引言: 我之前是有寫過一個利用UDP傳送畫面的程式過,被擷取畫面的機器隨時都在用一個timer擷取畫面,切割成橫豎8*8的小區塊,將每個小區塊的圖型內容(bit值,不做壓縮)做CRC32的編碼過後,放在一個array[0..63] of int64的固定陣列中,跟上回抓的64個區域CRC32值各自比對,只要不同的就代表這塊區域的畫面有變動過,再把這小塊的圖給client端就好,記得傳送之前需要將傳送的內容圖做jpeg壓縮,並加上區域編號,client端收到這個jpeg壓縮圖,只要按著區域編號,貼到相對應的坐標上即可,timer的interval值可以弄到50(1秒觸發20次)
poyulin兄 可否給我您那個程式的原碼來借我參考
抱歉, 那個程式應該是japhenchen兄寫的..!我也還在學習中
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-04-28 13:14:40 IP:211.96.xxx.xxx 未訂閱
等我這幾天中國內地開始放五一勞動節五天長假的時候再給大家這個原始碼,好嗎?(中國如此重視勞工權益,放假都放五天,跟過年、國慶日平起平坐..台灣呢?) 這個抓圖的方法,是我在寫一套即時通訊程式的時候,附在程式上做遠端桌面搖控的功能,就是因為網際網路的速度沒辦法達到全屏傳送,只好用這種方法解決,不過說真的,只有一般的視窗操作才適合用這種方式處理,一來是因為畫面變化不會太大,二來畫面顏色數量不多,JPEG壓起來也可以省掉一堆傳送的空間,三則就是一般視窗程式的操作,前景的程式CPU使用量不高,二來對被控程式造成的系統DELAY也不那麼敏感,如果你想用來抓電影動畫GAME....勸大家還是走其他的路,真話一句 藏私の禁止
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-05-05 16:36:57 IP:219.133.xxx.xxx 未訂閱
OK,這個範例我已經完成並上載到http://delphi.ktop.com.tw/topic.php?TOPIC_ID=49554了,大家有空可以去看一下如何實做的,因為我原來做的是在一整個大系統下的一個監視畫面操作的功能,整個系統又是公司已注冊的版權(唉~),那我只好把我腦子里的東西給搾出來,記得多少寫多少,不記得或懶得寫,就參考別人的函數範例,東拼西湊,完成了這個例子,五一長假都已經休了五天才完成這答應大家的東西,實在是不好意思啦~~~~~(誰叫我要生小孩,放假就得帶孩子出去玩,沒什麼空待在電腦上啦) 藏私の禁止
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-05-06 09:12:15 IP:210.60.xxx.xxx 未訂閱
japhenchen 兄 因以前都從圖形內讀出每一個點,所以計算的速度太慢 但看您的原碼後,已應知道該如何做了, 實在感謝您的大力支持,若可重新給分,定給您一票
powerhowardchen
初階會員


發表:15
回覆:28
積分:28
註冊:2004-04-19

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-05-12 18:26:54 IP:210.201.xxx.xxx 未訂閱
有要Sample嗎? 我剛好有寫ㄧ組程式, ㄧ個是發送程式,ㄧ個是接收程式, 用TCP/IP傳送(比較穩, 因為我測過用UDP的, Lose資料很誇張), 以1024x768全彩24bit傳送, 當最大畫面的照片(自全螢幕變動)更新時, 平均約1秒(在10MB/S時)可完成, 而若只是移動滑鼠, 則絕對沒問題. 完全Delphi撰寫, 但要使用JPEG. 另, 每秒15張!?!? 天方夜譚, 不可能的不可能, ㄧ般就算是VOD, 也決不可能達到1024x768, 更何況也決不是True Color, 這支程式目前是極限(以單一Thread而言). 要的話跟我說: howardchen@pie.com.tw
Mummy
一般會員


發表:11
回覆:9
積分:4
註冊:2004-02-20

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-07-29 18:18:12 IP:61.220.xxx.xxx 未訂閱
想請問 1.你之前用UDP會 lose資料,你有try過在同一台PC 發送及接收資料, 也會lose資料嗎? 你知道為何會lose資料嗎? 2. 請問你用什麼把圖show 出來,可show JPG嗎 ? 3. 請問我想發送及接收JPG(about 60kBytes) 30張/Second 可嗎? 4. 可否給我 sample ? My email: fny83@yahoo.com.tw
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#21 引用回覆 回覆 發表時間:2007-10-01 21:33:28 IP:125.224.xxx.xxx 未訂閱
相關問題
http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=90508
有沒有連續擷取電腦視窗畫面,好的壓縮方法。
http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=90528
快速比對有差異的區塊
http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=90615
二張image相同的話 則不須傳送 直到不同才傳送資料
http://delphi.ktop.com.tw/board.php?cid=168&fid=920&tid=38144
VNC畫面即時傳輸原理
http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=77575
如何Hook住屏幕的变化?
http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=66710
如何实现屏幕广播?
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=72915
如何知道哪个区域(任意的)被重画了
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=93346
請教屏幕算法的改進ScreenSpy

最近又看到關於vnc的問題,剛好最近比較有空,就下定決心下載原始碼去了解背後的實作原理
希望能給原發問者比較明確的解答,要偵測螢幕改變的區塊就如japhenchen所講的可以將
螢幕切成64塊,檢查哪一塊是有變動的,但這個方法無法精準的知道改變的區域為何?
japhenchen所提供的範例http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=49554
實際上UltraVNC和TightVNC反而不是用這方法,這兩個軟體所採用的是Mirror driver的技術
我在win2000 DDK有找到範例原始碼(C:\NTDDK\src\video\displays\mirror)
在MSDN可以找到簡介
A mirror driver is a display driver for a virtual device that mirrors the drawing
operations of one or more additional physical display devices.
相較於BitBlt,Mirror driver對系統的負擔比較小,而且比對差異的部分就由driver解決了
應用程式可以直接取得變動的區域為何?而TightVNC採用DemoForge的DFMirage Mirror Driver
有興趣的網友可以利用google找到dfmirage SDK的下載位置,
提供文件下載位置http://www.demoforge.com/sdk/DfMirageSDK.doc
(待續)
編輯記錄
bugmans 重新編輯於 2007-10-01 21:44:00, 註解 無‧
bugmans 重新編輯於 2007-11-09 17:09:53, 註解 無‧
bugmans 重新編輯於 2007-12-07 14:43:01, 註解 無‧
bugmans 重新編輯於 2007-12-15 14:38:02, 註解 無‧
bugmans 重新編輯於 2008-04-25 18:05:16, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#22 引用回覆 回覆 發表時間:2007-10-30 22:37:06 IP:125.224.xxx.xxx 未訂閱
先安裝DFMirage driver
http://www.demoforge.com/tightvnc/dfmirage-setup-1.1.68.2.exe

從裝置管理確認Driver是否安裝成功,此範例只針對1024*352的畫面變動進行偵測
範例程式下載http://delphi.ktop.com.tw/download.php?download=upload/4727415dbea06_Project1.exe

編輯記錄
bugmans 重新編輯於 2007-10-30 22:38:41, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#23 引用回覆 回覆 發表時間:2007-11-17 14:00:37 IP:125.225.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=90508
看別人的寫法是每個視窗都個別儲存,但是我不太知道是如何做法
而我想到是每個畫面用差值編碼來編
不知道各位有沒有連續擷取電腦視窗畫面,好的壓縮方法。
很想做出像flash那樣。
我再從這個問題再繼續延伸,要將螢幕畫面儲存成flash格式已經有許多的軟體可以作到此功能,但我只能從開放原始碼的軟體來著手
於是我找到CamStudio這個軟體,試用過發現這軟體是先錄成avi檔後才另外轉成swf檔,轉檔的程式碼在
C:\CamStudio.2.5.b1.src\Full sources\Producer
一開始用VC6編譯時會出現一大堆錯誤,上google查討論區才知道要先安裝STLport
但到現在我的電腦還是無法安裝STLport成功,只好直接讀CamStudio程式碼
(STLport安裝方式請看STL源碼剖析最後面的附錄)http://jjhou.csdn.net/tass-20020106.pdf
關於swf的程式碼主要在playplusView.cpp裡實作,從OnFileConverttoswf開始

[code cpp]
void CPlayplusView::OnFileConverttoswf()
{
PerformFlash(ww,hh,currentTime);
produceFlashHTML(...);
}
//-----------------------------------------------------
bool CPlayplusView::PerformFlash(...)
{
...
int gfConverting = TRUE;
while (gfConverting)//轉檔的迴圈
{if (currentTime > timeEnd)
{gfConverting = FALSE;}
ConvertToFlash(currentTime, hdc, hbm, f);
}
}
//-----------------------------------------------------
void ConvertToFlash(...)
{
for (int i=0; i {lpbi = AVIStreamGetFrame(gapgf[i], lSamp);//取得來源的frame
PaintSwfFrame(hdc, hbm, rcFrame, lpbi, i,f);
}
}
//-----------------------------------------------------
void PaintSwfFrame(...)
{
alpbi = GetFrame(hbm, &bitmap, BITMAP_X, BITMAP_Y, convertBits);
WriteSwfFrame(alpbi, f, bitmap, BITMAP_X, BITMAP_Y, format);
}
//-----------------------------------------------------
void WriteSwfFrame(...)
{
int frametype = ProcessSwfFrame( alpbi, f, bitmap, BITMAP_X, BITMAP_Y, format);
//和前一個frame比較差異,讓swf判斷要設為intermediate還是key frame
...
}
[/code]
一直到WriteSwfFrame副程式才用到下列的物件
FlashZLibBitmapData , FlashTagDefineBitsLossless2 , FlashMatrix,FlashFillStyleBitmap
FlashFillStyleArray , FlashShapeWithStyle , FlashShapeRecordChange , FlashTagRemoveObject2
這些物件定義在C:\CamStudio.2.5.b1.src\Full sources\Producer\swfsource目錄下
出自http://sourceforge.net/projects/swfsource/
說明檔也只是用doxygen轉出來的也沒有更詳細的解釋,只好先在這裡打住
(待續)
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#24 引用回覆 回覆 發表時間:2007-11-28 12:09:39 IP:60.250.xxx.xxx 訂閱
每次都記錄跟前一個畫面有差的部分即可。
有差的部分可能由幾小塊的區塊,這時要合併一些區塊,形成一個大區塊
然後記錄x,y,width,height,然後看width*height是否已經很大,很大的話就存整張畫面(因為你之後看圖的時候,可能會托曳看,如果從頭到尾都差值編碼可能有問題)
將x,y,width,height,畫面資料,儲存在資料庫即可。
畫面資料在儲存時可採用幾種壓縮方法,一種是JPG,在電腦複雜的畫面上會壓比較好(圖片,影片,網頁),但是壓一般(檔案總管的畫面)不太好。
而採用串流壓縮對複雜的處理還好,但是一般的很不錯。BMP加串流壓縮lzw或內鍵有的。
而如果採並用的方式,要考慮畫面協不協調的,因為有些用JPG,有些用串流壓縮,這個可以再看看。

最後寫個顯示的程式來顯示它即可,

如果沒有一直要儲存視窗畫面,可以再加上一些HOOK判斷,去判斷重要的事件再截圖(如按滑鼠及鍵盤)



很想知道你掃描用耗CPU的範例程式,也可省去掃描判斷。
===================引 用 bugmans 文 章===================
http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=90508
看別人的寫法是每個視窗都個別儲存,但是我不太知道是如何做法
而我想到是每個畫面用差值編碼來編
不知道各位有沒有連續擷取電腦視窗畫面,好的壓縮方法。
很想做出像flash那樣。
我再從這個問題再繼續延伸,要將螢幕畫面儲存成flash格式已經有許多的軟體可以作到此功能,但我只能從開放原始碼的軟體來著手
於是我找到CamStudio這個軟體,試用過發現這軟體是先錄成avi檔後才另外轉成swf檔,轉檔的程式碼在
C:\CamStudio.2.5.b1.src\Full sources\Producer
一開始用VC6編譯時會出現一大堆錯誤,上google查討論區才知道要先安裝STLport
但到現在我的電腦還是無法安裝STLport成功,只好直接讀CamStudio程式碼
(STLport安裝方式請看STL源碼剖析最後面的附錄)http://jjhou.csdn.net/tass-20020106.pdf
關於swf的程式碼主要在playplusView.cpp裡實作,從OnFileConverttoswf開始

[code cpp]
void CPlayplusView::OnFileConverttoswf()
{
PerformFlash(ww,hh,currentTime);
produceFlashHTML(...);
}
//-----------------------------------------------------
bool CPlayplusView::PerformFlash(...)
{
...
int gfConverting = TRUE;
while (gfConverting)//轉檔的迴圈
{if (currentTime > timeEnd)
{gfConverting = FALSE;}
ConvertToFlash(currentTime, hdc, hbm, f);
}
}
//-----------------------------------------------------
void ConvertToFlash(...)
{
for (int i=0; i {lpbi = AVIStreamGetFrame(gapgf[i], lSamp);//取得來源的frame
PaintSwfFrame(hdc, hbm, rcFrame, lpbi, i,f);
}
}
//-----------------------------------------------------
void PaintSwfFrame(...)
{
alpbi = GetFrame(hbm, &bitmap, BITMAP_X, BITMAP_Y, convertBits);
WriteSwfFrame(alpbi, f, bitmap, BITMAP_X, BITMAP_Y, format);
}
//-----------------------------------------------------
void WriteSwfFrame(...)
{
int frametype = ProcessSwfFrame( alpbi, f, bitmap, BITMAP_X, BITMAP_Y, format);
//和前一個frame比較差異,讓swf判斷要設為intermediate還是key frame
...
}
[/code]
一直到WriteSwfFrame副程式才用到下列的物件
FlashZLibBitmapData , FlashTagDefineBitsLossless2 , FlashMatrix,FlashFillStyleBitmap
FlashFillStyleArray , FlashShapeWithStyle , FlashShapeRecordChange , FlashTagRemoveObject2
這些物件定義在C:\CamStudio.2.5.b1.src\Full sources\Producer\swfsource目錄下
出自http://sourceforge.net/projects/swfsource/
說明檔也只是用doxygen轉出來的也沒有更詳細的解釋,只好先在這裡打住
(待續)
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#25 引用回覆 回覆 發表時間:2007-12-29 09:45:33 IP:125.225.xxx.xxx 未訂閱
相關問題-螢幕攝影 CPU使用問題
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=91897
有哪一些可以即時錄下螢幕動作的軟體?
http://delphi.ktop.com.tw/board.php?cid=168&fid=923&tid=80145

既然是螢幕攝影那prtscn副程式應該一直被呼叫執行,我之前有追蹤過CamStudio的原始碼
這個軟體的擷取螢幕畫面也是呼叫GetDC,BitBlt,ReleaseDC,這應該不是速度變慢的地方
我注意到你的程式碼有好幾個Create函式,在執行時不就一直呼叫
而jpg.SaveToStream(st);也一直存資料到記憶體,說不定在資料轉移的時候浪費了太多時間

我建議的作法是仿效CamStudio利用AVI開頭的函數(AVIFileInit,AVIFileOpen,AVIFileCreateStream...)
先將螢幕畫面先儲存到.avi暫存檔後再進行後續的處理(請參考vscapView.cpp的RecordVideo副程式)
並搭配使用CamStudio所提供的CamstudioCodec的無損壓縮編碼器
(採用lzo演算法http://zh.wikipedia.org/wiki/LZO)
確保取出來的frame和當初的畫面相同,也避免採用jpg壓縮所造成的畫面失真

類似軟體
Desktop Screen Record 5 http://www.recordscreen.com/
ScreenRecord 1.6.2 http://www.miensoftware.com/screenrecord.html
Bulent's Screen Recorder http://www.thesilver.net/
wink http://www.debugmode.com/wink/
試用wink後應該能了解我的意思,當初錄影時只有儲存畫面,等使用者結束錄影後
wink再製作縮圖或在游標位置畫上斜線方框,再讓使用者進行後續的編輯
編輯記錄
bugmans 重新編輯於 2007-12-29 09:47:18, 註解 無‧
bugmans 重新編輯於 2008-09-13 13:02:44, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#26 引用回覆 回覆 發表時間:2008-01-04 22:56:14 IP:125.224.xxx.xxx 未訂閱
我參考P.GopalaKrishna所提供的CAviFile物件
Create Movie From HBitmap
http://www.geocities.com/krishnapg/createmovie.html
並搭配CamStudio所提供的Lossless Codec(無損壓縮編碼器)
完成了這個範例,你可以比較不同編碼器所錄出來的品質
範例下載http://delphi.ktop.com.tw/download.php?download=upload/477e489e46215_ScreenCaputre.rar

註:
1.安裝CamStudio Lossless Codec
解開CamStudioCodec10.zip,在camcodec.inf檔案上按滑鼠右鍵安裝
編碼器代號為mmioFOURCC('C','S','C','D')

2.在BCB編譯CAviFile物件
原始碼使用了_T()和_tcsncpy,但在BCB卻無法辨識
利用#define轉成BCB相容的指令就可以編譯了
#define _T(s) s
#define _tcsncpy(arg1,arg2,arg3) strcpy(arg1,arg2)

3.其他的技術
http://sourceforge.net/project/showfiles.php?group_id=96803
另外還有DirectX FrontBuffer Mechanism和Windows Media Encoder的方法
說不定效果會比用GDI還好
編輯記錄
bugmans 重新編輯於 2008-01-05 07:35:50, 註解 無‧
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#27 引用回覆 回覆 發表時間:2008-01-14 18:02:56 IP:60.250.xxx.xxx 訂閱
想請教是否有這個範例程式的程式碼,我裝了dfmirage後,但我不會像你一樣對變動進行偵測然後用方塊圍起來。
我主要想要把不同的區域能抓出一大塊經合併的的區塊來做處理,所以須要你的程式來看看。期待你的出現。
===================引 用 bugmans 文 章===================
先安裝DFMirage driver
http://www.demoforge.com/tightvnc/dfmirage-setup-1.1.68.2.exe

從裝置管理確認Driver是否安裝成功,此範例只針對1024*352的畫面變動進行偵測
範例程式下載http://delphi.ktop.com.tw/download.php?download=upload/4727415dbea06_Project1.exe

17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#28 引用回覆 回覆 發表時間:2008-03-19 15:47:39 IP:60.250.xxx.xxx 訂閱
很想使用mirror driver來編寫,但是為什麼每次active螢幕都會閃一下,有方法可以讓螢幕不閃嗎
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#29 引用回覆 回覆 發表時間:2008-09-13 13:10:28 IP:125.225.xxx.xxx 未訂閱
Mirror Driver For Delphi Source Code

Mirror Driver For Delphi The Mirror Video Driver is a driver that can use to be quickly and efficiently notified with screen changes. Using it on an Delphi applications results in a excellent accuracy.The video driver also makes a direct link between the video driver frammebuffer memory and Delphi applications. Using the framebuffer directly eliminates the use of the CPU for intensive screen blitting, resulting in a big speed boost and very low CPU load.
Mirror Driver For Delphi core (its driver) is written in C and NTDDK,and very thin wrapper around this core written in Delphi.

Supports Borland Delphi All version.
Easy to use, all you need is only add one pas file to project.
Support Windows NT/2000/XP/2003.
Free dcu for delphi 7!
http://www.jingtaolab.com/
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#30 引用回覆 回覆 發表時間:2009-09-28 21:51:44 IP:125.225.xxx.xxx 未訂閱
UltraVnc Mirror Driver
The Mirror Video Driver is a driver that UltraVNC (for instance) can use to be quickly and efficiently notified with screen changes. Using it on an UltraVNC server results in a excellent accuracy. The video driver also makes a direct link between the video driver frammebuffer memory and UltraWinVNC server. Using the framebuffer directly eliminates the use of the CPU for intensive screen blitting, resulting in a big speed boost and very low CPU load.

http://www.uvnc.com/features/sdk.html
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#31 引用回覆 回覆 發表時間:2011-02-11 13:51:31 IP:114.42.xxx.xxx 未訂閱
剛才找到的

DGScreenSpy
http://iamgyg.blog.163.com/blog/static/38223257201011183174218/
http://iamgyg.blog.163.com/blog/static/382232572009518113852872/

檔案下載:http://iamgyg.ys168.com/
密碼:DGOpenSource
Delphi程式碼,編譯時需要ICS


另一個
Remote Control PCs
http://www.codeproject.com/KB/IP/remotecontrol.aspx


[<<] [1] [2] [>>]
系統時間:2017-12-17 20:02:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!