c++ DirectShow播放任意格式的视频
利用opencv只能處理.avi的視頻,opencv之前的版本之前試過好像是只能處理.avi未壓縮版本的視頻,未壓縮過的視頻相當大,一個文件大概是幾十個G。(這個不確定,因為之前用的壓縮過的.avi的格式的cvCreateFileCapture時會出錯)
后來利用opencv的新版本可以處理H.264/mpeg4等壓縮格式的.avi文件,但是還是不能處理像現在很廣泛應用的flv等格式,當然可以用ffmpeg來處理,可以參考樓主博客:
http://blog.csdn.net/kuaile123/article/details/11188975
http://blog.csdn.net/kuaile123/article/details/11367309?
http://blog.csdn.net/kuaile123/article/details/11378925
如果圖簡單點可以播放其他格式的視頻,windows下可以直接用DirectShow。
DirectShow是微軟公司在ActiveMovie和Video for Windows的基礎上推出的新一代基于COM(Component Object Model)的流媒體處理的開發包。DirectShow使用一種叫Filter Graph的模型來管理整個數據流的處理過程。它廣泛地支持各種媒體格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等,為多媒體流的捕捉和回放提供了強有力的支持。
DirectShow所需要的庫都在微軟C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include
直接用vs,不需要配置庫文件路徑,直接在工程中:
#include <DShow.h>
#include <atlbase.h>
#pragma comment(lib, "strmbasd.lib")
如果找不到strmbasd.lib可以去下載 http://download.csdn.net/detail/kuaile123/6233243
如果提示.h文件找不到,就需要自己安裝directshow。http://www.microsoft.com/en-us/download/details.aspx?id=8442
不多說了,代碼也很簡單,只是能播放視頻而已。
?
#include "stdafx.h" #include <DShow.h> //#include "qedit.h" #include <atlbase.h> #pragma comment(lib, "strmbasd.lib")#define SAFE_RELEASE(filter) { if(NULL != filter) { filter->Release(); filter = NULL; } }void main() {IGraphBuilder *pGraphBuilder = NULL; //Filter graph管理器IMediaControl *pMediaControl = NULL; //控制視頻/音頻的播放、暫停與停止IMediaEvent *pMediaEvent = NULL; //捕獲播放過程中的事件CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraphBuilder);if(FAILED(hr)) { printf("CoCreateInstance Failed!\n"); goto __exit; }hr = pGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);if(FAILED(hr)) { printf("Query Media Control Interface Failed!\n"); goto __exit; }hr = pGraphBuilder->QueryInterface(IID_IMediaEvent, (void **)&pMediaEvent);if(FAILED(hr)) { printf("Query Media Event Interface Failed!\n"); goto __exit; }//讓directshow自動根據要播放的文件的格式,生成filter graph hr = pGraphBuilder->RenderFile(L"F:\\愛在春天 TV版 47.flv", NULL); //自行修改待播放的視頻文件if(FAILED(hr)) { printf("RenderFile Failed!\n"); goto __exit; }hr = pMediaControl->Run();if(FAILED(hr)) { printf("Run Failed!\n"); goto __exit; }long code = 0;hr = pMediaEvent->WaitForCompletion(INFINITE, &code); //等待視頻播放完畢if(FAILED(hr)) { printf("WaitForCompletion Failed!\n"); goto __exit; }__exit:SAFE_RELEASE(pMediaEvent);SAFE_RELEASE(pMediaControl);SAFE_RELEASE(pGraphBuilder);CoUninitialize();system("pause"); }
?
?
總結
以上是生活随笔為你收集整理的c++ DirectShow播放任意格式的视频的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最新版ffmpeg 提取视频关键帧
- 下一篇: libSVM介绍