本教程展示了如何使用LEADTOOLS多媒体SDK创建一个c# Windows控制台应用程188宝金博怎么下载序,该应用程序获取两个媒体文件,一个视频和一个音频,并将它们组合成一个媒体文件。
概述 | |
---|---|
总结 | 本教程介绍如何在c# Windows控制台应用程序中组合媒体文件。 |
完成时间 | 30分钟 |
Visual Studio项目 | 下载教程项目(5kb) |
平台 | Windows c#控制台应用程序 |
IDE | Visual Studio 2017, 2019 |
开发许可 | 下载LEADTOOLS |
用另一种语言试试 |
|
步骤熟悉创建项目的基本步骤添加引用和设置License教程,在工作之前结合来自不同来源的视频和音频-控制台c#教程。
中创建的项目的副本开始添加引用和设置License教程。如果您没有该项目,请按照该教程中的步骤创建它。
所需要的参考资料取决于项目的目的。引用可以使用本地DLL引用添加,需要以下DLL。
dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ Dotnet4 \ x64
:
Leadtools.dll
Leadtools.188宝金博怎么下载Multimedia.dll
有关LEADTOOLS多媒体应用程序所需DLL文件的完整列表,请参阅188宝金博怎么下载188宝金博怎么下载应用程序中包含的多媒体文件.
许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License.
有两种类型的运行时许可证:
请注意
中详细介绍了添加LEADTOOLS本地引用和设置许可添加引用和设置License教程。
随着项目的创建、引用的添加和许可的设置,编码就可以开始了。
在“解决方案资源管理器”中打开Program.cs
,然后加上使用Leadtools.Mult188宝金博怎么下载imedia;
到使用
顶部的块。
使用系统;
使用先;
使用Leadtools;
使用Leadtools.188宝金博怎么下载Multimedia;
类中添加一个新方法程序
类命名CombineAudioandVideo(string _videoFile, string _audioFile, string _targetFile)
.方法中调用此新方法Main ()
方法调用SetLicense ()
方法。传递给新方法的字符串值将是视频文件、音频文件的文件路径,以及组合媒体文件的目标文件路径。确保你添加了STAThreadAttribute
向COM组件指示应用程序是单线程线程模型。
(STAThread)
静态无效主要(字符串[]参数)
{
字符串videoFile =@"视频源文件的文件路径";
字符串audioFile =@"音频源文件的路径";
字符串targetFile =@"组合输出媒体文件的文件路径";
SetLicense ();
CombineAudioandVideo(视频文件,audioFile, targetFile);
}
中添加下面的代码CombineAudioandVideo ()
方法来创建SampleTarget
S表示音频和视频文件,并启动ConvertCtrl
年代。
静态无效CombineAudioandVideo (字符串_videoFile,字符串_audioFile,字符串_targetFile)
{
ConvertCtrl vidConvert =新ConvertCtrl ();
ConvertCtrl audConvert =新ConvertCtrl ();
// Init SampleTargets。文件中的Video和Audio数据将写入这些文件
SampleTarget vidTarget =新SampleTarget ();
SampleTarget audTarget =新SampleTarget ();
//设置VideoTarget的Media Type为Video
MediaType mt =新MediaType ();
mt.Type = Constants.MEDIATYPE_Video;
vidTarget.SetAcceptedMediaType (mt);
vidConvert。TargetObject = vidTarget;
/ /清楚
太=零;
//设置AudioTarget的媒体类型为Audio
太=新MediaType ();
mt.Type = Constants.MEDIATYPE_Audio;
audTarget.SetAcceptedMediaType (mt);
audConvert。TargetObject = audTarget;
/ /清楚
太=零;
//设置ConvertCtrls指向文件作为它们的源
vidConvert。SourceFile = _视频文件;
audConvert。SourceFile = _audioFile;
//开始运行两个转换控件这些写入样例目标
vidConvert.StartConvert ();
audConvert.StartConvert ();
//输入组合方法
(vidTarget, audTarget, _targetFile);
//停止运行ConvertCtrls
如果(vidConvert。State == ConvertState.Running)
vidConvert.StopConvert ();
如果(audConvert。State == ConvertState.Running)
audConvert.StopConvert ();
//处理写入数据的目标
vidTarget.Dispose ();
audTarget.Dispose ();
//处理将文件数据读入SampleTarget buffer的ConvertCtrls
vidConvert.Dispose ();
audConvert.Dispose ();
}
添加了上面的代码之后,创建一个名为组合文件(SampleTarget _vidTarget, SampleTarget _audTarget, string _targetFile)
.方法中调用此方法CombineAudioandVideo ()
方法代码,如上所示。方法将下面的代码添加到新方法中以使用ConvertCtrl
要合并两个媒体文件。
静态无效组合文件(SampleTarget _vidTarget, SampleTarget _audTarget,字符串_targetFile)
{
MultiStreamSource pMSSource;
ConvertCtrl结合;
//初始化MultiStreamSource这是我们的Combine ConvertCtrl将读取的数据,然后最终写入填充
//我们有两个流。0 =视频1 =音频
pMSSource =新MultiStreamSource ();
pMSSource。StreamCount = 2;
//设置源视频流的MediaType为VideoTarget所连接数据的MediaType
MediaType mt = _vidTarget.GetConnectedMediaType();
pMSSource。SetMediaType (0, mt);
/ /清楚
太=零;
//设置源音频流的Mediatype为连接到AudioTarget的数据的Mediatype
mt = _audTarget.GetConnectedMediaType();
pMSSource。SetMediaType(1吨);
/ /清楚
太=零;
// Init将输出文件的Combine ConvertCtrl。这个ConvertCtrl将接收MultiStream Source并在磁盘上输出一个文件
结合=新ConvertCtrl ();
结合。源对象= pMSSource;
结合。目标文件= _targetFile;
combine.VideoCompressors.H264。选择=真正的;
combine.AudioCompressors.AAC.Selected =真正的;
结合。TargetFormat = targetformatttype . mpeg2transport;
//我们的mediasamsamples。从我们的SampleTargets检索到的源和将写入MultiStreamSource的目的地
MediaSample pmsSrc =零;
MediaSample pmsDst =零;
长LastStart;
长LastStop;
intlActualDataLength;
//开始运行Combine ConvertCtrl
combine.StartConvert ();
//视频写入
而(真正的)
{
试一试
{
//获取目标样本。
//注意,如果我们到达数据流的末尾,一个异常将触发并打破循环。这就是我们如何知道停止写入缓冲区
pmsSrc = _vidTarget.GetSample(6000);
//获取源缓冲区
pmsDst = pMSSource。GetSampleBuffer (0, 2000);
}
抓(异常)
{
打破;
}
试一试
{
//获取源样本时间
pmsSrc。取得时间(出LastStart,出LastStop);
//设置目标采样时间
pmsDst。凝固时间(LastStart LastStop);
}
抓(异常)
{
pmsDst.ResetTime ();
}
//复制数据
lActualDataLength = pmsSrc.ActualDataLength;
//设置目标缓冲区
//我们可以在这里Marshal非托管缓冲区,但不需要,因为我们只是
//将目标设置为源缓冲区内容(未更改的数据)
pmsDst。SetData (lActualDataLength pmsSrc.GetData (lActualDataLength));
//复制其他标志
pmsDst。Discontinuity = pmsSrc.Discontinuity;
pmsDst。Preroll = pmsSrc.Preroll;
pmsDst。SyncPoint = pmsSrc.SyncPoint;
//释放源样本
pmsSrc =零;
//传递目标样本
pMSSource。DeliverSample(0, 1000, pmsDst);
//释放目标样本
pmsDst =零;
}
//音频写入
而(真正的)
{
试一试
{
//获取目标样本
//注意,如果我们到达数据流的末尾,一个异常将触发并打破循环。这就是我们如何知道停止写入缓冲区
pmsSrc = _audTarget.GetSample(6000);
//获取源缓冲区
pmsDst = pMSSource。GetSampleBuffer (2000);
}
抓(异常)
{
打破;
}
试一试
{
//获取源样本时间
pmsSrc。取得时间(出LastStart,出LastStop);
//设置目标采样时间
pmsDst。凝固时间(LastStart LastStop);
}
抓(异常)
{
pmsDst.ResetTime ();
}
//复制数据
lActualDataLength = pmsSrc.ActualDataLength;
//设置目标缓冲区
//我们可以在这里Marshal非托管缓冲区,但不需要,因为我们只是
//将目标设置为源缓冲区内容(未更改的数据)
pmsDst。SetData (lActualDataLength pmsSrc.GetData (lActualDataLength));
//复制其他标志
pmsDst。Discontinuity = pmsSrc.Discontinuity;
pmsDst。Preroll = pmsSrc.Preroll;
pmsDst。SyncPoint = pmsSrc.SyncPoint;
//释放源样本
pmsSrc =零;
//传递目标样本
pMSSource。DeliverSample(1, 1000, pmsDst);
//释放目标样本
pmsDst =零;
}
//传递样本结束以停止转换
pMSSource。DeliverEndOfStream (0, 1000);
pMSSource。DeliverEndOfStream (1000);
//停止合并转换ctrl如果它还没有
如果(结合。State == ConvertState.Running)
combine.StopConvert ();
//重置源
combine.ResetSource ();
/ /处理
pMSSource.Dispose ();
combine.Dispose ();
}
按下运行项目F5,或选择Debug ->开始调试.
如果正确地执行了这些步骤,应用程序将运行并将音频和视频源文件转换为一个媒体文件。如果您使用上面的示例文件,这就是预期的输出媒体文件.
方法将两个媒体文件(一个视频和一个音频)组合到一个文件中ConvertCtrl
类。