❶ 求一款大家常用的視頻壓縮軟體
壓縮寶典——TMPGEnc與Canopus ProCoder
推薦使用TMPGEnc或Canopus ProCoder,其實會聲會影也可以進行視頻的壓縮,但是它的壓縮的最大缺點是畫面中的色塊特別多,而且壓縮時的可調節參數較少,所以我們還是選用專業的軟體來壓縮吧。
TMPGEnc是日本人開發的一套MPEG編碼工具軟體,支持VCD、SVCD、DVD等多種格式,所以許多網友習慣稱它為「小日本」。它能將各種常見影片文件進行壓縮、轉換成符合VCD、SVCD、DVD等的視頻格式,這個軟體非常的小巧和高效.
Canopus ProCoder 是目前的壓縮軟體中畫質、畫面細節處理方面相當好的一個,它的設計基於Canopus專利DV和MPEG-2 codecs技術,支持輸出到MPEG-1、 MPEG-2、 Windows媒體、RealVideo、Apple QuickTime、Microsoft DirectShow、Microsoft Video for Windows、Microsoft DV、Microsoft DV和Canopus DV視頻格式。
這兩個軟體可以說是當前視頻壓縮軟體一族中比較優秀的代表人物.
❷ 有什麼軟體可以把視頻資料壓縮但不影響播放質量的
只要是把播放碼率降低,播放質量就必然下降,因為原有的信息被壓縮掉了,細節就沒有了,只能找折中方案,在給定碼率條件下做到效果最好,這個跟編碼方式有關,比如,·264編碼就是藍光碟的編碼方式,採用動態碼率,在畫面黑暗的場景和畫面內容基本靜止時可以採用低碼率,而在動作場面,加大碼率,同時保證整個影片的平均碼率,越好的編碼方式就越是耗費cpu時間,下面的軟體是公認的高畫質編碼軟體
TMPGEnc是日本人堀浩行開發的一套老牌的高畫質視頻編碼轉換工具軟體,在 Canopus ProCoder v2.0 Final 推出以前,一直是視頻轉換領域的畫質冠軍,支持 VCD、SVCD、DVD 以及所有主流媒體格式 (Windows Media、Real Video、Apple QuickTime、Microsoft DirectShow、Microsoft Video for Windows、Microsoft DV、Canopus DV、Canopus MPEG-1 和 MPEG-2 編碼),而且還提供對高清晰度視頻格式的支持。
❸ 如何將directshow捕獲到的視頻數據打包成rtp包
捕獲到的數據是裸數據,需要壓縮。你可以找一個壓縮演算法例如x264,壓縮成H264文件。然後編寫RTP 12位元組的頭,將H264數據定界符後面的數據放進去就可以了。如果一幀數據大需就需要再分片。
❹ 用directshow寫的視頻壓縮程序為什麼在工控機上不能壓縮,工控機是xp系統的,在普通的xp電腦上卻能運行
工控機只是一個加固的PC 機而已,壓縮問題屬於軟體問題,並不是什麼問題都跟硬體掛鉤,這個思想是錯誤的,機子出問題了只要能開機,正常進系統,基本上跟硬體關系不大,先軟後硬逐個來 ,多了解問題,這個過程就是學習!經驗就是這樣來的!100分好多啊,真捨得!
❺ 怎樣壓縮視頻
Batch Real Procer 1.5.3.1 簡體中文版
軟體大小:4365KB 軟體類別:國產軟體/視頻工具
下載次數:188427 軟體授權:免費版
軟體語言:簡體中文 運行環境:Win9x/Me/NT/2000/XP/2003
軟體評級: 更新時間:2004-4-10 10:57:14
開 發 商:Home Page 聯 系 人:未知
軟體詳細信息
一個批量RM文件生成器。採用全新的RealVideo9內核。與目前其他的Real9格式壓縮器不同的是,BRP是調用Real9的內核來進行壓縮,而不是調用Helix Procer Plus 9的命令行來實現壓縮的。可以支持眾多的文件格式。比如:avi、mpg、vob、dat(VideoCD file)等等,只要是採用微軟公司的DirectShow介面就可以播放的媒體文件,基本都可以導入。
具體的功能有:
可以設定壓縮列表,軟體按照列表自動順序壓縮。
可以選擇壓縮完成後自動關機,便於長時間無人運行。
帶看門狗功能:如果因為源文件有錯導致壓縮引擎死鎖,180秒後系統自動終止當前文件的壓縮(終止過程約需20~40秒),開始壓縮列表中的下一個文件。
內部採用經驗參數進行設定,用戶可以在不設定任何參數的情況下壓縮出高質量的RealMedia文件。
下載地址:
http://flashget.newhua.com/down/brp1531_chs.exe
❻ 怎樣用DirectShow來壓縮一個AVI文件
這里我們講解怎樣用DirectShow來壓縮一個AVI文件。我們重點放到視頻壓縮,同樣的方法可以應用到音頻壓縮。
我們分以下幾步來講解:
1、 選擇一個壓縮過濾器
有許多種方法可以壓縮視頻或者音頻,比如:
a、 本地DirectShow過濾器
b、 視頻壓縮管理編碼器(VCM)
c、 音頻壓縮管理編碼器(ACM)
d、 DirectX媒體對象(DMOs)
在DirectShow中,VCM被AVI Compressor過濾器封裝了。同樣的,ACM編碼器也被ACM Wrapper過濾器封裝了。DMOs被DMO Wrapper過濾器封裝。系統設備枚舉器提供了一個統一的方法來枚舉和創建這些壓縮器,我們不用考慮底層的操作。
枚舉設備方法請參照前面的講述。這里我們只給出代碼:
void OnInitDialog(HWND hDlg)
{
HRESULT hr;
ICreateDevEnum *pSysDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
IMoniker *pMoniker = NULL;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
(void**)&pSysDevEnum);
hr = pSysDevEnum->CreateClassEnumerator(
CLSID_VideoCompressorCategory, &pEnum, 0);
while (S_OK == pEnum->Next(1, &pMoniker, NULL))
{
IPropertyBag *pPropBag = NULL;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
(void **)&pPropBag);
VARIANT var;
VariantInit(&var);
hr = pPropBag->Read(L"FriendlyName", &var, 0);
if (SUCCEEDED(hr))
{
LRESULT iSel = AddString(GetDlgItem(hDlg,
IDC_CODEC_LIST), var.bstrVal);
}
VariantClear(&var);
pPropBag->Release();
pMoniker->Release();
}
SendDlgItemMessage(hDlg, IDC_CODEC_LIST,
LB_SETCURSEL, 0, 0);
pSysDevEnum->Release();
pEnum->Release();
}
創建一個過濾器的實例,調用IMoniker::BindToObject方法。方法會返回一個IBaseFilter介面指針。就象下面那樣:
IBaseFilter *pFilter = NULL;
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
(void**)&pFilter);
if (SUCCEEDED(hr))
{
// 可以使用過濾器了
// 記著釋放IBaseFilter介面指針
}
2、 設置視頻壓縮屬性
視頻壓縮過濾器可以在它的輸出引腳支持IAMVideoCompression介面。使用這個介面可以設置壓縮的屬性,比如楨率,壓縮質量等待。
首先,調用IBaseFilter::EnumPins方法找到過濾器的輸出引腳,然後為介面查詢引腳。一些過濾器不是所有的介面都支持,也有的不支持某個壓縮屬性。為了決定支持的屬性能力,我們調用IAMVideoCompression::GetInfo來確定。這個方法返回一些信息:
a、 一個設置性能的標識
b、 一個描述字元串和版本字元串
c、 默認的楨速率,質量等參數
它按照下面的語法調用:
hr = pCompress->GetInfo(pszVersion, &cbVersion, pszDesc, &cbDesc,
&lKeyFrame, &lPFrame, &dblQuality, &lCap);
pszVersion和pszDesc參數是接收版本和描述字元串的寬字元緩沖區。cbVersion和cbDesc參數接收被請求的緩沖區大小。IkeyFrame,lPFrame和dblQuality參數獲得默認的楨速率,p楨率和質量。質量是用從0.0到1.0的浮點數來表示的。Icap參數獲得一個被或的能力標識,這個被定義為CompressionCaps枚舉類型。
這些參數的任何一個都可以設置為NULL,。例如如果為了獲得版本和描述字元串,第一次調用方法的時候,第一個和第三個參數為NULL。使用返回值cbVersion和cbDesc來分配緩沖區,然後再次調用該方法:
int cbVersion, cbDesc; // Size in bytes, not characters!
hr = pCompress->GetInfo(0, &cbVersion, 0, &cbDesc, 0, 0, 0, 0);
if (SUCCEEDED(hr))
{
WCHAR *pszVersion = new WCHAR[cbVersion/2];
WCHAR *pszDesc = new WCHAR[cbDesc/2];
hr = pCompress->GetInfo(pszVersion, 0, pszDesc, 0, 0, 0, 0, 0);
}
iCap參數提供了對IAMVideoCompression方法的過濾器的支持能力。例如,如果iCap包含了CompressionCaps_CanKeyFrame標志,你就可以調用IAMVideoCompression::get_KeyFrameRate方法來得到關鍵楨的速率,調用IAMVideoCompression::put_KeyFrameRate來設置楨速率。如果iCap的值沒有包含這些參數,那麼就只能使用默認的值了。
if (lCap & CompressionCaps_CanKeyFrame)
{
hr = pCompress->get_KeyFrameRate(&lKeyFrame);
if (FAILED(hr) || lKeyFrame < 0)
{
lKeyFrame = lDefaultKeyFrame; // 來自 GetInfo.
}
}
下面的代碼試著在輸出引腳尋找IAMVideoCompression介面。如果成功,它將會返回默認的和實際的壓縮屬性值。
HRESULT hr = E_FAIL;
IEnumPins *pEnum = NULL;
IPin *pPin = NULL;
IAMVideoCompression *pCompress = NULL;
// 尋找支持 IAMVideoCompression的引腳
pFilter->EnumPins(&pEnum);
while (S_OK == pEnum->Next(1, &pPin, NULL))
{
hr = pPin->QueryInterface(IID_IAMVideoCompression, (void**)&pCompress);
pPin->Release();
if (SUCCEEDED(hr)) // Found the interface.
{
break;
}
}
if (SUCCEEDED(hr))
{
long lCap; // 性能標識
long lKeyFrame, lPFrame; // 真實值
double m_Quality;
long lKeyFrameDef, lPFrameDef; //默認值
double QualityDef;
//得到默認值和它的性能
hr = pCompress->GetInfo(0, 0, 0, 0, &KeyFrameDef, &lPFrameDef,
&QualityDef, &lCap);
if (SUCCEEDED(hr))
{
// 得到實際的值.
if (lCap & CompressionCaps_CanKeyFrame)
{
hr = pCompress->get_KeyFrameRate(&lKeyFrame);
if (FAILED(hr) || lKeyFrame < 0)
lKeyFrame = lKeyFrameDef;
}
if (lCap & CompressionCaps_CanBFrame)
{
hr = pCompress->get_PFramesPerKeyFrame(&lPFrame);
if (FAILED(hr) || lPFrame < 0)
lPFrame = lPFrameDef;
}
if (lCap & CompressionCaps_CanQuality)
{
hr = pCompress->get_Quality(&Quality);
if (FAILED(hr) || Quality < 0)
Quality = QualityDef;
}
}
}
注意:如果你使用IcaptureGraphBuilder2介面來創建你的過濾圖形,你可以調用IcaptureGraphBuilder2::FindInterface方法來獲得IAMVideoCompression介面。
3、 建立壓縮圖形
下圖是一個典型的AVI文件的過濾圖形:
AVI_Splitter過濾器從文件的源過濾器(File Source(Async))拉數據,然後分解到視頻和音頻流。視頻解壓縮過濾器解碼被壓縮的視頻,然後重新被視頻壓縮器重新壓縮。
被壓縮的視頻進入到AVI Mux過濾器。音頻流在這個例子中沒有被壓縮,因此它直接從AVI Splitter傳輸到AVI Mux。AVI Mux進行隔行掃描,然後使用File Write過濾器將數據輸出到磁碟上。注意,就算原始文件裡面沒有音頻流,AVI Mux過濾器也是必須的。最簡單的方法創建這種過濾圖形就是使用Capture Graph Builder,這是DirectShow裡面為了建立捕獲圖形或者別的定製的過濾圖形的一個部件。
注意:DirectShow裡麵包含了兩個Capture Graph Builder版本。它們提供了不同的介面和類的標識。早期的版本類標識是CLSID_CaptureGraphBuild,介面是IcaptureGraphBuilder。它兼容存在的應用程序。新版本的類標識是CLSID_CaptureGraphBuilder2新的介面名稱是IcaptureGraphBuilder2。新的介面比老的介面有更多的靈活性。
創建Capture Graph Builder我們還是使用CoCreateInstance:
ICaptureGraphBuilder2 *pBuild = NULL;
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,
NULL, CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2, (void **)&pBuild);
然後我們使用Capture Graph Builder來建立過濾圖形:
a、 建立部分渲染的過濾圖形,它包含AVI Mux 過濾器和File Writer過濾器。
b、 添加源過濾器和壓縮過濾器。
c、 連接源過濾器到MUX 過濾器。
下面逐步的解釋每一個細節:
建立渲染段
為了建立過濾圖形的渲染段,調用IcaptureGraphBuilder2::SetOutputFileName方法。它返回一個MUX的過濾器和File Write的指針。MUX是下面建立過濾圖形所需要的,但是這個例子不需要File Write,因此,它的參數為NULL。
IBaseFilter *pMux = NULL;
pBuild->SetOutputFileName(
&MEDIASUBTYPE_Avi, //文件類型
wszOutputFile, // 文件名
&pMux, // 得到一個指向multiplexer的指針
NULL); // 得到一個指向File Write的指針
當該方法返回,MUX過濾器有一個很明顯的參考計數,所以以後一定要確保釋放它。MUX過濾器提供了兩個介面來控制AVI格式:
IconfigInterleaving介面:設置交錯模式
IconfigAviMux介面:設置主流和AVI兼容性的索引
添加源過濾器和壓縮過濾器
下一步我們要在過濾圖形中添加源過濾器和壓縮過濾器。當你調用SetOutputFileName的時候,Capture Graph Builder會自動的創建一個過濾圖形管理器的實例。你可以調用IcaptureGraphBuilder::GetFiltergraph方法來獲得剛才創建的過濾圖形管理器的指針。
IGraphBuilder *pGraph = NULL;
pBuild->GetFiltergraph(&pGraph);
現在我們該調用IgraphBuilder::AddSourceFilter方法來添加非同步文件源過濾器,然後調用IfilterGraph::AddFilter方法來添加視頻壓縮過濾器:
IBaseFilter *pSrc = NULL;
pGraph->AddSourceFilter(wszInputFile, L"Source Filter", &pSrc);
pGraph->AddFilter(pVComp, L"Compressor");
到了這一步我們的狀態就象下圖那樣,源過濾器和壓縮過濾器沒有和別的任何過濾器連接。
連接源到Mux
最後一步就是通過視頻壓縮過濾器連接源過濾器到AVI Mux過濾器。我們使用IcaptureGraphBuilder2::RenderStream方法來連接源過濾器的輸出引腳到指定的過濾器。
前兩個參數指定了用那個源過濾器的引腳來連接,通過指明引腳的分類和媒體類型來實現。非同步文件源過濾器只有一個輸出引腳,所以這些參數要設置成NULL。後三個參數指定了源過濾器,壓縮過濾器,和Mux過濾器。
下面的代碼演示了通過視頻壓縮過濾器來渲染視頻流:
pBuild->RenderStream(
NULL, // 輸出引腳類型
NULL, // 媒體類型
pSrc, // 源過濾器
pVComp, // 壓縮過濾器
pMux);
假定源文件包含了音頻流,AVI Splitter過濾器會在輸出引腳輸出音頻流。為了連接這個管腳我們需要再次調用RenderStream:
pBuild->RenderStream(NULL, NULL, pSrc, NULL, pMux);
這里我們沒有指定壓縮過濾器。而且源過濾器的輸出引腳已經連接了,因此RenderStream方法會搜索一個未連接的輸出引腳到Splitter過濾器。它可以直接連接引腳到MUX過濾器。但是如果源文件沒有音頻流,那麼第二次調用會失敗。
4、 寫文件
如果想寫文件正常的進行,你必須調用ImediaControl::Run方法來運行過濾圖形。等到播放完成後調用ImediaControl::Stop。
如果要顯示文件的寫的進度,你可以使用ImediaSeeking來查詢Mux過濾器。調用ImediaSeeking::GetDuration方法來獲得文件的持續時間。定時的使用ImediaSeeking::GetCurrentPostition方法來獲得當前的位置,但必須要是過濾圖形運行中。
注意,一般情況下我們用ImediaSeeking介面查詢過濾圖形管理器來定位,如果正在寫文件的話,這將是一個特例。這里我們要查詢Mux過濾器就可以了。查詢過濾圖形定位要求回放的時候才可以,而不是寫文件的時候。
看了下面的代碼讀者就會更加清楚了。
IMediaSeeking *pSeek = NULL;
IMediaEventEx *pEvent = NULL;
IMediaControl *pControl = NULL;
REFERENCE_TIME rtTotal;
hr = pMux->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
hr = pGraph->QueryInterface(IID_IMediaEventEx, (void**)&pEvent);
hr = pGraph->QueryInterface(IID_IMediaControl, (void**)&pControl);
// 設置DirectShow的時間通報
hr = pEvent->SetNotifyWindow((OAHWND)hwnd, WM_GRAPHNOTIFY, 0);
hr = GetDuration(&rtTotal);
SendDlgItemMessage(hwnd, IDC_PROGRESS1, PBM_SETRANGE, 0,
MAKELPARAM(0, rtTotal / 10000000));
// 開始時間.
UINT_PTR res = SetTimer(hwnd, nIDEvent, 100, NULL);
// 運行過濾圖形.
pControl->Run();
當應用程序收到定時器事件,它就更新當前位置:
void OnTimer(HWND hDlg, IMediaSeeking *pSeek)
{
REFERENCE_TIME rtNow;
HRESULT hr = pSeek->GetCurrentPosition(&rtNow);
if (SUCCEEDED(hr))
{
SendDlgItemMessage(hDlg, IDC_PROGRESS1, PBM_SETPOS, rtNow/10000000, 0);
}
}
當應用程序收到DirectShow結束事件,它就可以停止圖形,就象下面那樣:
LRESULT CALLBACK WndProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
/* ... */
case WM_GRAPHNOTIFY:
DoHandleEvent();
break;
/* ... */
}
}
void DoHandleEvent()
{
long evCode, param1, param2;
bool bComplete = false;
if (!pEvent) return;
//得到所有的事件
while (SUCCEEDED(pEvent->GetEvent(&evCode, ¶m1, ¶m2, 0))
{
pEvent->FreeEventParams(evCode, param1, param2);
switch(evCode)
{
case EC_USERABORT:
case EC_ERRORABORT:
case EC_COMPLETE:
bComplete = true;
break;
}
}
if (bComplete)
{
pControl->Stop(); // Important! You must stop the graph!
//關掉事件通報.
pEvent->SetNotifyWindow(NULL, 0, 0);
pEvent->Release();
pEvent = NULL;
SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, 0, 0);
KillTimer(hwnd, nIDEvent);
}
}
❼ Directshow Des視頻編碼的問題
你會用DirectShow顯示圖片嗎?求助!!!!!
❽ 求directshow視頻圖像縮放與旋轉演算法
這個操作可以參考directshow samples裡面的filter ezrgb24,
參照這個示例可以實現對sample的圖像進行變換的功能。
它的實施步驟大概是這樣的:先將pIn的數據直接復制到pOut,然後將pOut的數據取出來進行變換。
變換進行的操作參考一些DIB演算法庫就可以了。
❾ 有什麼好的視頻壓縮軟體
壓縮寶典——TMPGEnc與Canopus ProCoder
推薦使用TMPGEnc或Canopus ProCoder,其實會聲會影也可以進行視頻的壓縮,但是它的壓縮的最大缺點是畫面中的色塊特別多,而且壓縮時的可調節參數較少,所以我們還是選用專業的軟體來壓縮吧。
TMPGEnc是日本人開發的一套MPEG編碼工具軟體,支持VCD、SVCD、DVD等多種格式,所以許多網友習慣稱它為「小日本」。它能將各種常見影片文件進行壓縮、轉換成符合VCD、SVCD、DVD等的視頻格式,這個軟體非常的小巧和高效.
Canopus ProCoder 是目前的壓縮軟體中畫質、畫面細節處理方面相當好的一個,它的設計基於Canopus專利DV和MPEG-2 codecs技術,支持輸出到MPEG-1、 MPEG-2、 Windows媒體、RealVideo、Apple QuickTime、Microsoft DirectShow、Microsoft Video for Windows、Microsoft DV、Microsoft DV和Canopus DV視頻格式。
簡單的,專業的軟體 procoder3 ,支持高清壓縮,基本上什麼格式都能夠壓縮和轉換,還能批量轉換。 現在網上有中文版和破解版 Grass Valley ProCoder 3 的前身就是廣受贊譽的 Canopus ProCoder 2 ,其結合速度和靈活性於一體,是一款適合專業人士使用的先進的視頻轉換工具。作為廣受贊譽的編碼轉換軟體的領先者,ProCoder 3 具有廣泛的輸入輸出選項、先進的濾鏡、批處理功能和簡單易用的界面。不管您是為製作DVD進行MPEG編碼,或為流媒體應用進行WindowsMedia編碼,或是為了 NTSC 和 PAL 之間相互轉換,ProCoder3 都能快速而方便地進行視頻轉換。可以將單個源文件同時轉換成多個目標文件,用批處理模式連續進行多個文件的轉換工作,或者用 ProCoder3 的拖放預設按鈕進行一鍵式轉換。 新特性: 一、支持更多移動視頻格式 — 新增H.264的編碼和解碼,ProCoder 3 可以為時下流行的 Apple iPod03 和Sony PSP64 等移動視頻設備轉換和輸出這些格式的文件。 二、增加了對EDIUS產品工作流程的更多支持 — ProCoder3 已經包含了Canopus HQ 編解碼器,ProCoder 可以獨立進行 Canopus HQ 文件的編碼和解碼,而無需預先安裝 EDIUS 軟體。 三、支持AVCHD便攜攝像機的格式 — 新增的 AVCHD 解碼功能可以將新一代的AVCHD便攜攝像機里的視頻素材轉換後用於編輯、輸出流媒體或刻錄 DVD。 四、加快多核 CPU 系統的編碼速度 — MPEG-2(傳輸流)的 Grid編碼支持,為新的多核或多 CPU 系統提供更快的編碼速度。當你編碼時選擇「預覽 DVD 目標」或「HDV 目標」時,將自動啟動該特性進行編碼。 五、支持杜比03數字音頻 — 在進行 DVD 製作和復制過程中, ProCoder 3 支持杜比數字音頻的編碼,在減小文件大小的同時提高了音頻的質量。ProCoder 3 還可以用內置的通道混合器來增加、改變和刪除目標格式中的單獨的音頻通道。 參考資料: