DirectShow实现音视频分离(Delphi)
2007-05-10 17:22
369 查看
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus,Directshow9,WMF9,StrUtils;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
MTVOpen: TOpenDialog;
VisionSave: TSaveDialog;
SoundSave: TSaveDialog;
N4: TMenuItem;
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
private
{ Private declarations }
id:integer;//调试用
FilterGraph:IGraphBuilder;
VisionFilter,SoundFilter:IBaseFilter;
MediaControl:IMediaControl;
procedure Freedirectshow();
procedure Createdirectshow(Const Filename:widestring);
procedure SetVisionConfig();
function setVisionSaveFilename():string;
procedure setVisionSave();
function CheckDefaultWav():boolean;
procedure SetSoundSave();
function setSoundSaveFilename():string;
procedure SetSoundConfig();
public
{ Public declarations }
function openfile(const filename:widestring):Boolean;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Comobj,DSUtil,ActiveX;
procedure TForm1.N3Click(Sender: TObject);
begin
close;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
if MTVOpen.Execute then
begin
if Openfile(MTVOpen.FileName)=false then
Messagebox(handle,'打开文件出错!','错误',MB_ICONERROR or MB_DEFBUTTON1 or MB_APPLMODAL);
end;
end;
procedure TForm1.Createdirectshow(Const Filename:widestring);
begin
id:=0;
FilterGraph:=Comobj.CreateComObject(CLSID_FilterGraph) as IGraphBuilder;
DSUtil.AddGraphToRot(FilterGraph,ID);
//视频部分
VisionFilter:=CreateComObject(CLSID_WMAsfWriter) as IBaseFilter;
setVisionSave;
FilterGraph.AddFilter(VisionFilter,'视频分流');
SetVisionConfig();
//音频部分
SoundFIlter:=CreateComObject(CLSID_WMAsfWriter) as IBaseFilter;
setSoundSave();
FilterGraph.AddFilter(SoundFilter,'音频分流');
setSoundConfig();
FilterGraph.RenderFile(PWideChar(Filename),nil);
FilterGraph.QueryInterface(IID_IMediaControl,MediaControl);
end;
procedure TForm1.Freedirectshow;
begin
if id<>0 then
DSUtil.RemoveGraphFromRot(ID);
VisionFilter:=nil;
SoundFilter:=nil;
MediaControl:=nil;
FilterGraph:=nil;
end;
function TForm1.openfile(const filename: widestring): Boolean;
begin
result:=false;
try
ID:=0;
FreeDirectshow();
CreateDirectshow(filename);
result:=true;
finally
abort;
end;
end;
procedure TForm1.SetVisionConfig;
var
Config:IConfigAsfWriter;
begin
try
if Assigned(VisionFilter) then
begin
if Failed(VisionFilter.QueryInterface(WMF9.IID_IConfigAsfWriter,Config)) then
raise Exception.Create('获得视频分流Filter配置接口失败!');
if Failed(Config.ConfigureFilterUsingProfileGuid(WMProfile_V80_56VideoOnly)) then
raise Exception.Create('配置视频分流Filter失败!');
end;
finally
Config:=nil;
end;
end;
function TForm1.setVisionSaveFilename: string;
begin
if VisionSave.Execute then
begin
if RightStr(trim(VisionSave.FileName),4)='.asf' then
begin
result:=VisionSave.FileName;
exit;
end;
result:=VisionSave.FileName+'.asf';
end;
end;
procedure TForm1.setVisionSave;
var
savefilename:widestring;
fileSinkFilter:IFileSinkFilter2;
fmt:TAMMediaType;
begin
savefilename:=setVisionSaveFilename;
try
if Failed(VisionFilter.QueryInterface(IID_IFileSinkFilter2,fileSinkFilter)) then
raise Exception.Create('获得视频分流FileSinkFilter失败!');
fileSinkFilter.SetMode(1);//AM_FILE_OVERWRITE
fillchar(fmt,sizeof(fmt),#0);
fmt.majortype:=MEDIATYPE_Video;
fmt.subtype:=MEDIASUBTYPE_Asf;
fmt.formattype:=FORMAT_VideoInfo;
Filesinkfilter.SetFileName(pwidechar(savefilename),@fmt);
finally
fileSinkFilter:=nil;
end;
end;
function TForm1.CheckDefaultWav: boolean;
begin
result:=false;
if FileExists(Extractfiledir(Application.ExeName)+'/Input/Default.asf') then
begin
result:=true;
end;
end;
procedure TForm1.SetSoundSave;
var
savefilename:widestring;
fileSinkFilter:IFileSinkFilter2;
fmt:TAMMediaType;
begin
savefilename:=setSoundSaveFilename;
try
if Failed(SoundFilter.QueryInterface(IID_IFileSinkFilter2,fileSinkFilter)) then
raise Exception.Create('获得视频分流FileSinkFilter失败!');
fileSinkFilter.SetMode(1);//AM_FILE_OVERWRITE
fillchar(fmt,sizeof(fmt),#0);
fmt.majortype:=MEDIATYPE_Audio;
fmt.subtype:=MEDIASUBTYPE_Asf;
fmt.formattype:=FORMAT_WaveFormatEx;
Filesinkfilter.SetFileName(pwidechar(savefilename),@fmt);
finally
fileSinkFilter:=nil;
end;
end;
function TForm1.setSoundSaveFilename: string;
begin
if SoundSave.Execute then
begin
if RightStr(trim(SoundSave.FileName),4)='.asf' then
begin
result:=SoundSave.FileName;
exit;
end;
result:=SoundSave.FileName+'.asf';
end;
end;
procedure TForm1.SetSoundConfig;
var
Config:IConfigAsfWriter;
begin
try
if Assigned(SoundFilter) then
begin
if Failed(SoundFilter.QueryInterface(WMF9.IID_IConfigAsfWriter,Config)) then
raise Exception.Create('获得视频分流Filter配置接口失败!');
if Failed(Config.ConfigureFilterUsingProfileGuid(WMProfile_V80_128StereoAudio)) then
raise Exception.Create('配置视频分流Filter失败!');
end;
finally
Config:=nil;
end;
end;
procedure TForm1.N4Click(Sender: TObject);
begin
if Assigned(MediaControl) then
MediaControl.Run;
end;
end.
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus,Directshow9,WMF9,StrUtils;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
MTVOpen: TOpenDialog;
VisionSave: TSaveDialog;
SoundSave: TSaveDialog;
N4: TMenuItem;
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
private
{ Private declarations }
id:integer;//调试用
FilterGraph:IGraphBuilder;
VisionFilter,SoundFilter:IBaseFilter;
MediaControl:IMediaControl;
procedure Freedirectshow();
procedure Createdirectshow(Const Filename:widestring);
procedure SetVisionConfig();
function setVisionSaveFilename():string;
procedure setVisionSave();
function CheckDefaultWav():boolean;
procedure SetSoundSave();
function setSoundSaveFilename():string;
procedure SetSoundConfig();
public
{ Public declarations }
function openfile(const filename:widestring):Boolean;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Comobj,DSUtil,ActiveX;
procedure TForm1.N3Click(Sender: TObject);
begin
close;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
if MTVOpen.Execute then
begin
if Openfile(MTVOpen.FileName)=false then
Messagebox(handle,'打开文件出错!','错误',MB_ICONERROR or MB_DEFBUTTON1 or MB_APPLMODAL);
end;
end;
procedure TForm1.Createdirectshow(Const Filename:widestring);
begin
id:=0;
FilterGraph:=Comobj.CreateComObject(CLSID_FilterGraph) as IGraphBuilder;
DSUtil.AddGraphToRot(FilterGraph,ID);
//视频部分
VisionFilter:=CreateComObject(CLSID_WMAsfWriter) as IBaseFilter;
setVisionSave;
FilterGraph.AddFilter(VisionFilter,'视频分流');
SetVisionConfig();
//音频部分
SoundFIlter:=CreateComObject(CLSID_WMAsfWriter) as IBaseFilter;
setSoundSave();
FilterGraph.AddFilter(SoundFilter,'音频分流');
setSoundConfig();
FilterGraph.RenderFile(PWideChar(Filename),nil);
FilterGraph.QueryInterface(IID_IMediaControl,MediaControl);
end;
procedure TForm1.Freedirectshow;
begin
if id<>0 then
DSUtil.RemoveGraphFromRot(ID);
VisionFilter:=nil;
SoundFilter:=nil;
MediaControl:=nil;
FilterGraph:=nil;
end;
function TForm1.openfile(const filename: widestring): Boolean;
begin
result:=false;
try
ID:=0;
FreeDirectshow();
CreateDirectshow(filename);
result:=true;
finally
abort;
end;
end;
procedure TForm1.SetVisionConfig;
var
Config:IConfigAsfWriter;
begin
try
if Assigned(VisionFilter) then
begin
if Failed(VisionFilter.QueryInterface(WMF9.IID_IConfigAsfWriter,Config)) then
raise Exception.Create('获得视频分流Filter配置接口失败!');
if Failed(Config.ConfigureFilterUsingProfileGuid(WMProfile_V80_56VideoOnly)) then
raise Exception.Create('配置视频分流Filter失败!');
end;
finally
Config:=nil;
end;
end;
function TForm1.setVisionSaveFilename: string;
begin
if VisionSave.Execute then
begin
if RightStr(trim(VisionSave.FileName),4)='.asf' then
begin
result:=VisionSave.FileName;
exit;
end;
result:=VisionSave.FileName+'.asf';
end;
end;
procedure TForm1.setVisionSave;
var
savefilename:widestring;
fileSinkFilter:IFileSinkFilter2;
fmt:TAMMediaType;
begin
savefilename:=setVisionSaveFilename;
try
if Failed(VisionFilter.QueryInterface(IID_IFileSinkFilter2,fileSinkFilter)) then
raise Exception.Create('获得视频分流FileSinkFilter失败!');
fileSinkFilter.SetMode(1);//AM_FILE_OVERWRITE
fillchar(fmt,sizeof(fmt),#0);
fmt.majortype:=MEDIATYPE_Video;
fmt.subtype:=MEDIASUBTYPE_Asf;
fmt.formattype:=FORMAT_VideoInfo;
Filesinkfilter.SetFileName(pwidechar(savefilename),@fmt);
finally
fileSinkFilter:=nil;
end;
end;
function TForm1.CheckDefaultWav: boolean;
begin
result:=false;
if FileExists(Extractfiledir(Application.ExeName)+'/Input/Default.asf') then
begin
result:=true;
end;
end;
procedure TForm1.SetSoundSave;
var
savefilename:widestring;
fileSinkFilter:IFileSinkFilter2;
fmt:TAMMediaType;
begin
savefilename:=setSoundSaveFilename;
try
if Failed(SoundFilter.QueryInterface(IID_IFileSinkFilter2,fileSinkFilter)) then
raise Exception.Create('获得视频分流FileSinkFilter失败!');
fileSinkFilter.SetMode(1);//AM_FILE_OVERWRITE
fillchar(fmt,sizeof(fmt),#0);
fmt.majortype:=MEDIATYPE_Audio;
fmt.subtype:=MEDIASUBTYPE_Asf;
fmt.formattype:=FORMAT_WaveFormatEx;
Filesinkfilter.SetFileName(pwidechar(savefilename),@fmt);
finally
fileSinkFilter:=nil;
end;
end;
function TForm1.setSoundSaveFilename: string;
begin
if SoundSave.Execute then
begin
if RightStr(trim(SoundSave.FileName),4)='.asf' then
begin
result:=SoundSave.FileName;
exit;
end;
result:=SoundSave.FileName+'.asf';
end;
end;
procedure TForm1.SetSoundConfig;
var
Config:IConfigAsfWriter;
begin
try
if Assigned(SoundFilter) then
begin
if Failed(SoundFilter.QueryInterface(WMF9.IID_IConfigAsfWriter,Config)) then
raise Exception.Create('获得视频分流Filter配置接口失败!');
if Failed(Config.ConfigureFilterUsingProfileGuid(WMProfile_V80_128StereoAudio)) then
raise Exception.Create('配置视频分流Filter失败!');
end;
finally
Config:=nil;
end;
end;
procedure TForm1.N4Click(Sender: TObject);
begin
if Assigned(MediaControl) then
MediaControl.Run;
end;
end.
相关文章推荐
- delphi 摄像头视频图像捕捉 不用directshow来实现 还有其它什么方法吗?
- 利用混合高斯模型实现视频中运动目标与背景的分离
- 用DirectShow实现视频采集
- DirectShow .Net 实现视频预览(重点源码记录)
- (必看)视频开发项目的技术来源、实现形式、走向。 --VFW。DirectSHow 。MediaFoundation
- 用DirectShow实现QQ的音视频聊天功能
- 一个视频聊天软件,目前已经实现远程视频语音通讯(DirectShow+UDP)
- 用DirectShow实现音视频文件的播放
- 基于DirectShow的MPEG-4视频传输系统的研究与实现
- 用DirectShow实现QQ的音视频聊天功能
- DirectShow实现抓图(Delphi)
- DirectShow .Net 实现视频
- 用DirectShow实现视频采集
- 基于Directshow的USB视频捕获Delphi篇(二)
- 用DirectShow实现视频採集-流程构建
- 用DirectShow实现QQ的音视频聊天功能
- 基于DirectShow的MPEG-4视频传输系统的研究与实现
- 用DirectShow实现QQ的音视频聊天功能
- directshow实现视频捕获(源码)vs2005
- 基于DirectShow的MPEG-4视频传输系统的研究与实现