DSPack 如何判斷所撥放的影像檔之解析度? |
尚未結案
|
Wawa
一般會員 發表:27 回覆:55 積分:16 註冊:2002-10-04 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
跟DirectX的程式設計方式一樣,FilterGraph要由上到下列舉出合適的過濾器,最上游就是FileSource檔案信息過濾器,把在檔頭宣告的部份做成PIN(接腳,插梢),這個PIN自動指明這媒体檔是MPEG1還是MPEG2或DIVX或RM的格式,當然也會說明檔案的長度,起始位址結束位址等等,FILTERGRAPH再往下列舉找出適合的分解(SPLITTER)媒体流的過濾器(聲音跟影像在此分流),往下分成二個PIN,一個代表聲音資料,一個PIN代表影像資料,當然也在里面指出了這二個資料流的起點終點位址長度壓縮編碼類別等等資訊,再列舉適合這二個PIN的過濾器,分別處理聲音跟影像的解壓工作,像MPEG AUDIO DECODER跟MPEG VIDEO DECODER二個最常用的FILTER,解壓出來的資料,跟上面的程序一樣,各要有個PIN來做代表,如果沒有意外,到這一步就是終點站,聲音送到音效卡驅動程式,影像就直接透過DIRECTX高速寫到顯示卡記憶体中 拉拉雜雜講了一堆,簡單一句話,DS不過就是用一堆過濾器和PIN,在系統內列舉出合適的供應需求鏈,這個鏈看起來像食物鏈,名字就叫做FILTERGRAPH....
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
引言: 跟DirectX的程式設計方式一樣,FilterGraph要由上到下列舉出合適的過濾器,最上游就是FileSource檔案信息過濾器,把在檔頭宣告的部份做成PIN(接腳,插梢),這個PIN自動指明這媒体檔是MPEG1還是MPEG2或DIVX或RM的格式,當然也會說明檔案的長度,起始位址結束位址等等,FILTERGRAPH再往下列舉找出適合的分解(SPLITTER)媒体流的過濾器(聲音跟影像在此分流),往下分成二個PIN,一個代表聲音資料,一個PIN代表影像資料,當然也在里面指出了這二個資料流的起點終點位址長度壓縮編碼類別等等資訊,再列舉適合這二個PIN的過濾器,分別處理聲音跟影像的解壓工作,像MPEG AUDIO DECODER跟MPEG VIDEO DECODER二個最常用的FILTER,解壓出來的資料,跟上面的程序一樣,各要有個PIN來做代表,如果沒有意外,到這一步就是終點站,聲音送到音效卡驅動程式,影像就直接透過DIRECTX高速寫到顯示卡記憶体中 拉拉雜雜講了一堆,簡單一句話,DS不過就是用一堆過濾器和PIN,在系統內列舉出合適的供應需求鏈,這個鏈看起來像食物鏈,名字就叫做FILTERGRAPH....请教一下,在DSPACK里,直接打开一个AVI文件或者JPEG的File,能够Show出图象来。 如果数据来源不是文件,而是自己的程式从网路上接收到的数据包,这些数据包组合起来是一个JPEG图片,该如何把这些数据直接给DirectShow? 当然,如果把收到的JPEG数据直接保存为File然后再用DsPack来打开是没问题的。但能不能直接把数据以Stream的格式或其它格式给DsPack来播放?是否需要自己写输入的Filter? |
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
答案是肯定的,在DirectShow中,媒体文件不止是狭义的动画或音乐,凡是与多媒体扯上一点关系的,像JPEG,BMP,GIF,PNG...,大多都可以被DS支持,要是不被支持,你也可以自己动手做个可以支持的过滤器来用,据我所知,网上就有可以利用DS的ZIP/UnZIP filter可以下载的到...
在DS中当然也可以处理网上的媒体串流文件,像ASF,RAM..等等,只要是你的电脑有适当的过滤器的话(正常安装DirectX8/WMP7以上的Windows都有支持),处理方式就跟一般的AVI,MPEG文件完全相同,没有两样..
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
Wawa
一般會員 發表:27 回覆:55 積分:16 註冊:2002-10-04 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
引言: 用DMO可以實現,不過一樣,要學一堆標準的COM 的寫作,不是一時半刻可以說的清的~況且目前找的到的文件全都是VC ,DELPHI的開發文件書籍完全缺乏~我記得有個天極網,里面就有幾篇關於DS FILTER及DMO的寫作教程,老實說,我VC 沒學紮實,看好久~~~~沒看懂~~~~谢谢!用DELPHI写COM 我倒是不怕。因为DELPHI可以自动帮我们生成COM 的框架,我们只要定义接口函数然后在里面写自己要的语句就可以了。 关键是不清楚Filter的结构是怎样的,所以没法下手。看了一些资料,又都是VC的,我也是对VC不熟悉,所以看不下去。 看来要搞清楚FILTER该怎么写,还得装DIRECTSHOW的SDK来看了。可我的HDD的空间不够装那个SDK了! |
Wawa
一般會員 發表:27 回覆:55 積分:16 註冊:2002-10-04 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
哈~忘了是来回答问题,不是来发表高论的~~~ 底下是取得影片解析度的方法(假设你用DSPACK)
procedure TWMPFORM.Button1Click(Sender: TObject); var BasicVideo: IBasicVideo; vwidth,vheight: integer; begin if FilterGraph.Play=true then begin if succeeded(FilterGraph.QueryInterface(IID_IBasicVideo,BasicVideo)) then begin BasicVideo.get_VideoWidth(vwidth); BasicVideo.get_VideoHeight(vheight); showmessage(inttostr(vWidth) ' x ' inttostr(vHeight)); end; end; end;格式就 發表人 - japhenchen 於 2004/02/18 16:37:34 |
Wawa
一般會員 發表:27 回覆:55 積分:16 註冊:2002-10-04 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
我贴了一半...~~~利用列举的方式把用到的媒体过滤器一一列示,暂时可以解决媒体种类分辨的问题
procedure TWMPFORM.Button2Click(Sender: TObject); var GraphBuilder: IGraphBuilder; FilterList:TFilterList; PinList:TPinList; x,y: integer; pininfo:TPinInfo; FilterInfo:TFilterInfo; outstr: string ; begin if FilterGraph1.Active then begin FilterGraph1.QueryInterface(IID_IGraphBuilder,GraphBuilder); Filterlist:=TFilterList.Create(GraphBuilder); for x := FilterList.Count downto 1 do begin FilterList.Items[x-1].QueryFilterInfo(FilterInfo); PinList:=TPinList.Create(FilterList.Items[x-1]); for y := PinList.Count downto 1 do begin if PinList.PinInfo[y-1].dir=PINDIR_INPUT then begin outstr:=outstr FilterList.FilterInfo[x-1].achName #13; end; end; PinList.Free; end; FilterList.Free; end; showmessage(outstr); end; |
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
上面的方法不入流,不过对我这样半桶水,这已经是最多咯~
因为一个FilterGraph模型不会是只有一个程式(过滤器)在处理播放中的媒体,有读取源文件的FileSourceFilter,还有分流用的SplitterFilter,视讯流解压的VideoDecoderFilter,声音流的AudioDecoderFilter,中介处理声音影像的EffectFilter(DirectShow并不会去自动调用,除非你早指定使用),输出到硬体的RenderFilter(像DirectX的音效輸出,顯示卡輸出等等),每個過濾器得到的流跟輸出的流都不同,所以無法以單項的方式來表示出是什麼格式什麼品質的,就列舉吧~~ 再給一個好玩的示範,加速播放(連聲音都加速了)
VAR GS2 : IMediaSeeking; begin if succeeded(FilterGraph1.QueryInterface(IMediaSeeking,GS2)) then begin GS2.SetRate(0.5); //慢速撥放 GS2.SetRate(1); //正常速撥放 GS2.SetRate(2); //2倍速撥放 GS2.SetRate(1.35); // 135%倍速撥放 (以上速度你就擇其一使用,很好玩的) end; |
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
列举媒体类型资源形态加强版
var GraphBuilder: IGraphBuilder; FilterList:TFilterList; PinList:TPinList; x,y,z: integer; pininfo:TPinInfo; FilterInfo:TFilterInfo; outstr: string ; EMT:TEnumMediaType; begin if FilterGraph1.Active then begin FilterGraph1.QueryInterface(IID_IGraphBuilder,GraphBuilder); Filterlist:=TFilterList.Create(GraphBuilder); for x := FilterList.Count downto 1 do begin FilterList.Items[x-1].QueryFilterInfo(FilterInfo); PinList:=TPinList.Create(FilterList.Items[x-1]); for y := PinList.Count downto 1 do begin if PinList.PinInfo[y-1].dir=PINDIR_OUTPUT then begin outstr:=outstr FilterList.FilterInfo[x-1].achName #13; EMT:=TEnumMediaType.Create(PinList.items[y-1]); for z:=EMT.Count downto 1 do outstr:=outstr ' [' EMT.MediaDescription[z-1] ']' #13; EMT.Free; end; end; PinList.Free; end; FilterList.Free; end; showmessage(outstr);我知道很難看懂,但基本上只用到了列舉的手段來處理這些事情,簡單的for..do的手法而已,應該不難,再討論吧 |
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
Wawa
一般會員 發表:27 回覆:55 積分:16 註冊:2002-10-04 發送簡訊給我 |
真的非常感謝 japhenchen 的舉例, 獲益良多.
除了好玩的加速播放功能外, 還有什麼好玩又有用的功能嗎?
先前我問過如何可在撥放影片的一開始就直接跳到指定的第n秒,
一直都沒人願舉例說明,後來我自己用不是非常滿意的做法解決了,
不知 japhenchen 能否多舉些這方面好玩又有用的功能呢? 另外請問 japhenchen , 你是自己研究, 還是有書可學習呢? DEMOES\D6-D7里面有個FILTERS的目錄,這我先前有注意過,但因不懂基本的理論, 所以也是有看沒有懂, 等 japhenchen 研究後, 能否發表來加惠我們呢? 再次謝謝 japhenchen 的辛苦及熱心
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
Wawa
一般會員 發表:27 回覆:55 積分:16 註冊:2002-10-04 發送簡訊給我 |
japhenchen 兄你好: 又來請教你一個問題.DSPack 有個 Webcam 的範例程式 "PlayVideoCap" 此程式顯示 Webcam 很好沒什麼問題. 但範例只限於在本機端, 如果要分成 Client/ Server , 那應該如何做才好? 我知道可透過 SampleGrabber 來抓取一張張的圖片, 但如何傳送到 Client 端才夠快呢? D5-D7 的 Socket 元件均不太一樣. 希望你不吝賜教, 再次的提供些程式碼供參考好嗎? 謝謝!! PS.在 KTop 我有看過有人提過類似的問題, 但並沒有看到很好的解答.
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
我還沒實做過這樣的課題,不過我的理解是 分清楚SERVER要丟出去的流是屬於哪一種,是主動push還是被動pull 如果是主動push(推),一般都是用來做即時視訊的情況使用,使用者一上線,看到的都是即時的片段,不能倒退不能快轉....那就可能要考慮到對方在不在線上,網速是不是足夠供應傳輸的資料量,還有萬一對方沒有收封包是該怎麼處置
最好的處置方法就是把可以放映的片段壓縮後一段一段用udp往外送,客戶端的部份就把收到的包一個一個往緩衝區送,再用另外一條執行緒負責檢查緩衝區是否達到目標量(一般存5秒到30秒,視頻寬及網路品質而定),再播放緩衝區里的影片片段,這樣就可以解決.....這樣的例子常見在網路電視,網路廣播~~ 另外一種就是被動poll(拉),SERVER就靜靜的等CLIENT來要資料,要一段我就丟一段,CLIENT也是收到每一段就往緩衝區塞,另一條執行緒檢查緩衝區播放,DELAY可能會輕點,實做的難度也相對的比較低些,這種例子在DIRECTSHOW的架構下很常見,主要用做付費電影等等的VOD上~~~~~ 不過不管哪一種,以現行的DSPACK套件或INDY套件都不太能做到,除非~自己編寫基於TCP/UDP的過濾器或DMO的SERVER及CLIENT,目前這些課題我也在研究中,以上只是基於我對流媒体的理解,懂的不多,只能臭蓋一下而已,還有很多要學的咧
|
Wawa
一般會員 發表:27 回覆:55 積分:16 註冊:2002-10-04 發送簡訊給我 |
japhenchen 你好: 謝謝你的分析.我想要的是由 Server(安裝 Webcam 之PC端) push(推) 向 Client 端,而且還希望是多點傳送.至於傳送的方式當然是選擇 UDP 較為方便快速些囉!! 暫且不管傳送的問題,我試用了 SampleGrabber, 發現對於 Webcam 及 VOB 無法抓取圖片, 其他格式(如 mp1,mp4,asf 等)則沒有問題, 不知道是否是我屬性設錯, 還是DSPack 的 SampleGrabber 不支援 Webcam 及 VOB, 我想先解決抓取影片的問題,再來一步步解決傳送的問題. 希望你還能多加指導, 非常謝謝你!! PS.我是用 DSPack 的 SampleGrabber 及 PlayVideoCap 此 2 個範例程式,合併來測試的.
|
Wawa
一般會員 發表:27 回覆:55 積分:16 註冊:2002-10-04 發送簡訊給我 |
japhenchen 兄你好: SampleGrabber 抓取 Webcam 的影像資料我已解決沒問題了. 影片的傳輸在
Lan 上效果也還不錯, 但多點撥放還沒想出較佳的解決方案, 我會好好努力再想
想看, 有沒有什麼較好的解決方法. 但 SampleGrabber 抓取 VOB 檔的影片還是一直無解決, 這個問題困擾我很久了,始終找不到解決的方案.(也曾經在 Delphi K.Top 也請教過,但始終沒人回應) 不知可否請 japhenchen , 指導我一下呢? 萬分的感謝!!
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
呵,我的習慣不好,電腦上不裝DVD-ROM.........因為我放電腦的客廳里有29吋的電視跟一台DVD機,所以一直沒有理由說服自己去買台DVD-ROM,所以那個
SAMPLEGRAB抓DVD的問題也就無法給個交待啦!真的不好意思。 你可以試試,以下的片段中的RENDERFILE(OPENDIALOG.FILENAME)改成RENDERDVD(OPENDIALOG.FILENAME),我猜沒問題了吧
procedure TForm1.OpenPlayClick(Sender: TObject); begin if OpenDialog.Execute then begin FilterGraph.Active := False; FilterGraph.Active := true; FilterGraph.RenderFile(OpenDialog.FileName); FilterGraph.Play; end; end; |
Wawa
一般會員 發表:27 回覆:55 積分:16 註冊:2002-10-04 發送簡訊給我 |
japhenchen 你好: RenderDVD 所需的參數也應該3 個吧!!
如下:
var a:TAMDVDRenderStatus;
FilterGraph.RenderDVD(a,OpenDialog.FileName,AM_DVD_HWDEC_PREFER); 你所建議的RENDERDVD,我試過了, 播放 VOB 檔都不行,SAMPLEGRAB 連試的機會都沒有了. 而原先 FilterGraph.RenderFile(OpenDialog.FileName) 至少還可播放 VOB 檔,只是 SAMPLEGRAB無法成功. 不知還有什麼高手可指導或網路可請教的,因此問題已困擾很久了. 謝謝!! PS. 會選用 DSPack 主要也是為了播 VOB 檔,否則 MediaPlayer 元件基本上還算夠用.
|
jenpeter
一般會員 發表:39 回覆:37 積分:15 註冊:2002-08-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |