结合来自不同来源的视频和音频-控制台c#

本教程演示如何使用LEADTOOLS多媒体SDK创建c# Windows控制台应用程序,该188宝金博怎么下载应用程序接受两个媒体文件,一个视频和一个音频,并将它们合并到一个媒体文件中。

概述
总结 本教程介绍如何在c# Windows控制台应用程序中组合媒体文件。
完成时间 30分钟
Visual Studio项目 下载教程项目(4kb)
平台 Windows c#控制台应用程序
IDE Visual Studio 2017, 2019
开发许可 下载LEADTOOLS

所需的知识

来熟悉创建项目的基本步骤添加引用和设置License教程,在工作之前结合来自不同来源的视频和音频-控制台c#教程。

创建项目并添加LEADTOOLS引用

中创建的项目的副本开始添加引用和设置License教程。如果您没有该项目,请按照该教程中的步骤创建它。

所需的参考资料取决于项目的目的。引用可以使用本地DLL引用添加,需要以下DLL。

dll位于< INSTALL_DIR > \ LEADTOOLS21 \ Bin \ Dotnet4 \ x64

有关LEADTOOLS多媒体应用程序需要哪些DLL文件的完整列表,请参阅188宝金博怎么下载188宝金博怎么下载你的申请须包括的多媒体档案

设置License文件

许可证解锁项目所需的特性。它必须在调用任何工具包函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License

有两种类型的运行时许可证:

请注意

中更详细地介绍了添加LEADTOOLS本地引用和设置许可证添加引用和设置License教程。

添加合并媒体文件的代码

随着项目的创建、引用的添加和许可证的设置,编码就可以开始了。

在解决方案资源管理器中,打开Program.cs,然后添加使用Leadtools.Mult188宝金博怎么下载imedia;使用在顶部阻塞。

c#
使用系统;使用先;使用Leadtools;使用Leadtools.188宝金博怎么下载Multimedia;

方法中添加一个新方法程序类命名CombineAudioandVideo(string _videoFile, string _audioFile, string _targetFile).方法中调用此新方法Main ()方法之后调用SetLicense ()方法。传入新方法的字符串值将是视频文件、音频文件的文件路径,以及组合媒体文件的目标文件路径。确保您添加了STAThreadAttribute向COM组件表明应用程序为单线程线程模式。

c#
(STAThread)静态无效主要(字符串[]参数)字符串videoFile =@"视频源文件路径"字符串audioFile =@"音频源文件的路径"字符串targetFile ="组合输出媒体文件的文件路径"SetLicense ();CombineAudioandVideo (videoFile audioFile targetFile);

出于本教程的目的,您可以使用它音频文件视频文件

将下面的代码添加到CombineAudioandVideo ()方法来创建SampleTargetS表示音频和视频文件,并启动ConvertCtrl年代。

c#
静态无效CombineAudioandVideo (字符串_videoFile,字符串_audioFile,字符串_targetFile)ConvertCtrl vidConvert =ConvertCtrl ();ConvertCtrl audConvert =ConvertCtrl ();//初始化SampleTargets。我们文件中的视频和音频数据将写入这些SampleTarget vidTarget =SampleTarget ();SampleTarget audTarget =SampleTarget ();//设置VideoTarget的媒体类型为VideoMediaType太=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。源文件= _videoFile;audConvert。源文件= _audioFile;//开始运行两个转换控件。这些是写给样本目标的vidConvert.StartConvert ();audConvert.StartConvert ();//输入Combine方法CombineFiles (vidTarget audTarget _targetFile);//停止运行ConvertCtrls如果(vidConvert。状态= = ConvertState.Running)vidConvert.StopConvert ();如果(audConvert。状态= = ConvertState.Running)audConvert.StopConvert ();//处理我们写入数据的目标vidTarget.Dispose ();audTarget.Dispose ();//处理将文件数据读取到SampleTarget缓冲区的ConvertCtrlsvidConvert.Dispose ();audConvert.Dispose ();

添加上述代码之后,创建一个名为组合文件(SampleTarget _vidTarget, SampleTarget _audTarget, string _targetFile).的内部调用此方法CombineAudioandVideo ()方法代码,如上所示。将下面的代码添加到新方法中以使用ConvertCtrl将两个媒体文件合并。

c#
静态无效组合文件(SampleTarget _vidTarget, SampleTarget _audTarget,字符串_targetFile)MultiStreamSource pMSSource;ConvertCtrl结合;//初始化MultiStreamSource。这是我们的Combine ConvertCtrl将读取并最终写入以填充的数据//我们有两个流。0 =视频1 =音频pMSSource =MultiStreamSource ();pMSSource。StreamCount = 2;//设置源视频流的MediaType为与VideoTarget连接的数据的MediaTypemt = _vidTarget.GetConnectedMediaType();pMSSource。SetMediaType (0, mt);/ /清楚太=//设置源音频流的Mediatype为连接到AudioTarget的数据的Mediatype太= _audTarget.GetConnectedMediaType ();pMSSource。SetMediaType(1吨);/ /清楚太=//初始化Combine ConvertCtrl来输出我们的文件。这个ConvertCtrl将接受多流源并在磁盘上输出一个文件结合=ConvertCtrl ();结合。SourceObject = pMSSource;结合。TargetFile = _targetFile;combine.VideoCompressors.H264。选择=真正的combine.AudioCompressors.AAC.Selected =真正的结合。TargetFormat = TargetFormatType.MPEG2Transport;/ /我们MediaSamples。从我们的SampleTargets检索的源和将写入MultiStreamSource的目的地MediaSample pmsSrc =MediaSample pmsDst =LastStart;LastStop;intlActualDataLength;//开始运行Combine ConvertCtrlcombine.StartConvert ();/ /视频写真正的试一试//获取目标样本。//注意,如果到达数据流的末尾,将触发异常并打破循环。这就是我们如何知道停止写入缓冲区pmsSrc = _vidTarget.GetSample (6000);//获取源缓冲区pmsDst = pMSSource。GetSampleBuffer (0, 2000);(异常)打破试一试//获取源样本时间pmsSrc。取得时间(LastStart,LastStop);//设置目标采样时间pmsDst。凝固时间(LastStart LastStop);(异常)pmsDst.ResetTime ();//复制数据lActualDataLength = pmsSrc.ActualDataLength;//设置目标缓冲区//我们可以在这里调度未管理的缓冲区,但没有必要,因为我们只是//将目标设置为源缓冲区内容(未更改的数据)pmsDst。SetData (lActualDataLength pmsSrc.GetData (lActualDataLength));//复制其他标志pmsDst。不连续= pmsSrc.Discontinuity;pmsDst。前滚= pmsSrc.Preroll;pmsDst。同步点= 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;//设置目标缓冲区//我们可以在这里调度未管理的缓冲区,但没有必要,因为我们只是//将目标设置为源缓冲区内容(未更改的数据)pmsDst。SetData (lActualDataLength pmsSrc.GetData (lActualDataLength));//复制其他标志pmsDst。不连续= pmsSrc.Discontinuity;pmsDst。前滚= pmsSrc.Preroll;pmsDst。同步点= pmsSrc.SyncPoint;//释放源样本pmsSrc =//发送目标样本pMSSource。pmsDst DeliverSample (1000);//释放目标样本pmsDst =//发送样本结束以停止转换pMSSource。DeliverEndOfStream (0, 1000);pMSSource。DeliverEndOfStream (1000);//停止合并转换ctrl如果它还没有如果(结合。状态= = ConvertState.Running)combine.StopConvert ();//重置源combine.ResetSource ();/ /处理pMSSource.Dispose ();combine.Dispose ();

运行该项目

通过按运行项目F5,或选择Debug ->开始调试

如果正确地执行了步骤,应用程序将运行并将音频和视频源文件转换为一个媒体文件。如果使用上面的示例文件,这是预期的输出媒体文件

总结

方法将两个媒体文件(一个视频和一个音频)合并为一个文件ConvertCtrl类。

另请参阅

net
iOS
188金宝搏的网址客服|支持|联系我们|知识产权的通知
©1991 - 2021领先的技术公司。保留所有权利。