本教程展示如何使用LEADTOOLS多188宝金博怎么下载媒体SDK创建一个Windows使用c++应用程序ltmmConvert
控制和其他LEADTOOLS对象将从单独的视频和音频文件合并到一个输出文件。
概述 | |
---|---|
总结 | 本教程展示了如何使用LEADTOOLS多媒体SDK将音频和视频合并成一个文件。188宝金博怎么下载 |
完成时间 | 30分钟 |
Visual Studio项目 | 下载教程项目(19 KB) |
平台 | Windows API c++应用程序 |
IDE | Visual Studio 2019 |
开发许可 | 下载LEADTOOLS |
试试用另一种语言 |
|
在工作之前结合视频和音频从不同来源——Windows c++教程中,完成添加引用和设置一个许可证教程。
开始的一个副本64位Windows API创建的项目添加引用和设置一个许可证教程。如果项目不可用,按照这个教程中的步骤创建它。
为了使用ltmmConvert
对象,LEADTOOLS需要额外的引用。添加所需的多媒体库通过打开预编译头188宝金博怎么下载文件的引用,pch.h
或stdafx.h
根据使用Visual Studio版本,并添加以下行:
/ /添加LEADTOOLS多媒体188宝金博怎么下载引用
# include“C: \ LEADTOOLS22 \ \ ltmm.h包括”
# include“C: \ LEADTOOLS22 \ \ ltmm_Errors.h包括”
/ / x64填词
# pragma评论(自由,“C: \ \ LEADTOOLS22 \ \ Lib \ \ CDLL \ \ x64 \ \ Ltmmx.lib”)
# pragma评论(自由,“C: \ \ LEADTOOLS22 \ \ Lib \ \ CDLL \ \ x64 \ \ ltmmuuidx.lib”)
与项目创建、添加引用,许可,可以开始编码。
在主CPP文件的项目,定位InitInstance ()
功能,并添加以下代码行,COM库初始化窗口。
BOOL InitInstance(实例句柄实例句柄,intnCmdShow)
{
CoInitialize(空);
/ /保留其余的功能不变
下面的步骤是针对Visual Studio 2019;他们可以为其他版本的Visual Studio是不同的。
去解决方案资源管理器并双击资源文件(.rc)。扩大资源树中菜单选项卡,双击菜单资源designer界面中打开它。下面的空项退出项,点击和类型合并音频和视频。拖动上面的新项目退出。确保项目的IDID_FILE_MERGEAUDIOANDVIDEO
。
项目的主CPP文件,其中包含的指向()
主窗口函数。导航到开关(wmId)
下面的语句WM_COMMAND
情况下,添加如下所示的新病例。
/ /指向(),在“案例WM_COMMAND:”
开关(wmId)
{
情况下ID_FILE_MERGEAUDIOANDVIDEO:
如果(失败(CombineAudioandVideo ()))
对话框(hWnd,文本(“结合失败”),文本(“LEADTOOLS演示”),MB_ICONERROR);
其他的
对话框(NULL,文本(“结合成功”),文本(“LEADTOOLS演示”),MB_ICONINFORMATION);
打破;
/ /把剩下的代码
下面的代码SelectCompressor ()
,CombineFiles ()
和CombineAudioandVideo ()
函数中使用的代码。
测试使用这些示例文件:
无效SelectCompressor (IltmmCompressors * pCompressors,常量TCHAR * pszCompressorName)
{
长指数;
型bstrCompressorName = SysAllocString (pszCompressorName);
pCompressors - >找到(bstrCompressorName、和);
pCompressors - > put_Selection(指数);
SysFreeString (bstrCompressorName);
}
HRESULT CombineFiles (IltmmSampleTarget * pVideoTarget IltmmSampleTarget * pAudioTarget,常量TCHAR * _targetFile)
{
IltmmMultiStreamSource * pMSSource =零;
HRESULT hr = CoCreateInstance (CLSID_ltmmMultiStreamSource, NULL, CLSCTX_INPROC_SERVER IID_IltmmMultiStreamSource (无效* *)&pMSSource);
如果(失败(人力资源)
返回人力资源;
pMSSource - > put_StreamCount (2);
IltmmMediaTypeDisp * pmt =零;
hr = pVideoTarget - > GetConnectedMediaType (pmt);
如果(失败(人力资源)
返回人力资源;
hr = pMSSource - > SetMediaType (0, pmt);
如果(失败(人力资源)
返回人力资源;
pmt - >释放();
pmt =零;
hr = pAudioTarget - > GetConnectedMediaType (pmt);
如果(失败(人力资源)
返回人力资源;
hr = pMSSource - > SetMediaType (pmt);
如果(失败(人力资源)
返回人力资源;
pmt - >释放();
pmt =零;
IltmmConvert * pCombineConvert =零;
hr = CoCreateInstance (CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER IID_IltmmConvert (无效* *)&pCombineConvert);
如果(失败(人力资源)
返回人力资源;
pCombineConvert - > put_SourceObject (pMSSource);
型bstrTargetFile = SysAllocString (_targetFile);
pCombineConvert - > put_TargetFile (bstrTargetFile);
SysFreeString (bstrTargetFile);
/ /选择所需的压缩机基础上的名字
#定义LEAD_H264_ENCODER L“@device:西南:{33 d9a760 - 90 - c8 - 11 - d0 bd43 - 00 - a0c911ce86} \ \ H264编码器(4.0)”
#定义LEAD_AAC_AUDIO_ENCODER L“@device:西南:{33 d9a761 - 90 - c8 - 11 - d0 bd43 - 00 - a0c911ce86} \ \ {e2b7dd70 - 38 - c5 - 11 - d5 - 91 - f6 - 00104 - bdb8ff9}”
/ /设置视频压缩
IltmmCompressors * pCompressors;
pCombineConvert - > get_VideoCompressors (&pCompressors);
SelectCompressor (pCompressors LEAD_H264_ENCODER);
pCompressors - >释放();
/ /设置音频压缩
pCombineConvert - > get_AudioCompressors (&pCompressors);
SelectCompressor (pCompressors LEAD_AAC_AUDIO_ENCODER);
pCompressors - >释放();
pCombineConvert - > put_TargetFormat (ltmmConvert_TargetFormat_MPEG2_TRANSPORT);
IltmmMediaSampleDisp * pmsSrc =零;
IltmmMediaSampleDisp * pmsDst =零;
长lStartTimeHi;
长lStartTimeLo;
长lStopTimeHi;
长lStopTimeLo;
vBuffer变体;
VARIANT_BOOL vBool;
长lActualDataLength;
/ /开始运行ConvertCtrl结合起来
pCombineConvert - > StartConvert ();
/ /视频写
而(真正的)
{
&pmsSrc pVideoTarget - > GetSample (10000);
如果(pmsSrc !)
打破;
/ /得到一个样本来源
hr = pMSSource - > GetSampleBuffer (0 10000 &pmsDst);
如果(失败(人力资源)
打破;
/ /将数据复制到源样本
hr = pmsSrc - > get_buf (&vBuffer);
如果(失败(人力资源)
打破;
hr = pmsSrc - > get_ActualDataLength (&lActualDataLength);
如果(失败(人力资源)
打破;
hr = pmsDst - > SetData (lActualDataLength vBuffer);
如果(失败(人力资源)
打破;
/ /复制样品时间
hr = pmsSrc - >取得时间(&lStartTimeHi、&lStartTimeLo &lStopTimeHi, &lStopTimeLo);
如果(失败(人力资源)
pmsDst - > ResetTime ();
其他的
{
hr = pmsDst - >设置系统时间(lStartTimeHi、lStartTimeLo lStopTimeHi, lStopTimeLo);
如果(失败(人力资源)
打破;
}
/ /复制其他旗帜
hr = pmsSrc - > get_Discontinuity (&vBool);
如果(失败(人力资源)
打破;
hr = pmsDst - > put_Discontinuity (vBool);
如果(失败(人力资源)
打破;
hr = pmsSrc - > get_Preroll (&vBool);
如果(失败(人力资源)
打破;
hr = pmsDst - > put_Preroll (vBool);
如果(失败(人力资源)
打破;
hr = pmsSrc - > get_SyncPoint (&vBool);
如果(失败(人力资源)
打破;
hr = pmsDst - > put_SyncPoint (vBool);
如果(失败(人力资源)
打破;
/ /释放源样本
pmsSrc - >释放();
pmsSrc =零;
/ /提供样本来源
hr = pMSSource - > DeliverSample (0 2000 pmsDst);
如果(失败(人力资源)
打破;
/ /释放源样本
pmsDst - >释放();
pmsDst =零;
}
/ /音频写
而(真正的)
{
&pmsSrc pAudioTarget - > GetSample (10000);
如果(pmsSrc !)
打破;
/ /得到一个样本来源
hr = pMSSource - > GetSampleBuffer (10000 &pmsDst);
如果(失败(人力资源)
打破;
/ /将数据复制到源样本
hr = pmsSrc - > get_buf (&vBuffer);
如果(失败(人力资源)
打破;
hr = pmsSrc - > get_ActualDataLength (&lActualDataLength);
如果(失败(人力资源)
打破;
hr = pmsDst - > SetData (lActualDataLength vBuffer);
如果(失败(人力资源)
打破;
/ /复制样品时间
hr = pmsSrc - >取得时间(&lStartTimeHi、&lStartTimeLo &lStopTimeHi, &lStopTimeLo);
如果(失败(人力资源)
pmsDst - > ResetTime ();
其他的
{
hr = pmsDst - >设置系统时间(lStartTimeHi、lStartTimeLo lStopTimeHi, lStopTimeLo);
如果(失败(人力资源)
打破;
}
/ /复制其他旗帜
hr = pmsSrc - > get_Discontinuity (&vBool);
如果(失败(人力资源)
打破;
hr = pmsDst - > put_Discontinuity (vBool);
如果(失败(人力资源)
打破;
hr = pmsSrc - > get_Preroll (&vBool);
如果(失败(人力资源)
打破;
hr = pmsDst - > put_Preroll (vBool);
如果(失败(人力资源)
打破;
hr = pmsSrc - > get_SyncPoint (&vBool);
如果(失败(人力资源)
打破;
hr = pmsDst - > put_SyncPoint (vBool);
如果(失败(人力资源)
打破;
/ /释放源样本
pmsSrc - >释放();
pmsSrc =零;
/ /提供样本来源
hr = pMSSource - > DeliverSample (2000 pmsDst);
如果(失败(人力资源)
打破;
/ /释放源样本
pmsDst - >释放();
pmsDst =零;
}
pCombineConvert - > StopConvert ();
pMSSource - > DeliverEndOfStream (0, 1000);
pMSSource - > DeliverEndOfStream (1000);
pCombineConvert - > ResetSource ();
pMSSource - >释放();
pCombineConvert - >释放();
返回人力资源;
}
intCombineAudioandVideo ()
{
/ /初始化转换控制
IltmmConvert * pVidConvert = NULL, * pAudConvert =零;
HRESULT hr = CoCreateInstance (CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER IID_IltmmConvert (无效* *)&pVidConvert);
如果(失败(人力资源)
返回人力资源;
hr = CoCreateInstance (CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER IID_IltmmConvert (无效* *)&pAudConvert);
如果(失败(人力资源)
返回人力资源;
/ /初始化SampleTargets。视频和音频数据从我们的文件会写这些。
IltmmSampleTarget * pVidTarget = NULL, * pAudTarget =零;
hr = CoCreateInstance (CLSID_ltmmSampleTarget, NULL, CLSCTX_INPROC_SERVER IID_IltmmSampleTarget (无效* *)&pVidTarget);
如果(失败(人力资源)
返回人力资源;
hr = CoCreateInstance (CLSID_ltmmSampleTarget, NULL, CLSCTX_INPROC_SERVER IID_IltmmSampleTarget (无效* *)&pAudTarget);
如果(失败(人力资源)
返回人力资源;
IltmmMediaTypeDisp * pmt =零;
hr = CoCreateInstance (CLSID_ltmmMediaType, NULL, CLSCTX_INPROC_SERVER IID_IltmmMediaTypeDisp (无效* *)pmt);
如果(失败(人力资源)
返回人力资源;
pmt - > put_Type((型)ltmmMEDIATYPE_Video);
/ /使SampleTarget对象接受连接的媒体类型
hr = pVidTarget - > SetAcceptedMediaType (pmt);
如果(失败(人力资源)
返回人力资源;
pVidConvert - > put_TargetObject (pVidTarget);
pmt - >释放();
pmt =零;
hr = CoCreateInstance (CLSID_ltmmMediaType, NULL, CLSCTX_INPROC_SERVER IID_IltmmMediaTypeDisp (无效* *)pmt);
如果(失败(人力资源)
返回人力资源;
pmt - > put_Type((型)ltmmMEDIATYPE_Audio);
/ /使SampleTarget对象接受连接的媒体类型
hr = pAudTarget - > SetAcceptedMediaType (pmt);
如果(失败(人力资源)
返回人力资源;
pAudConvert - > put_TargetObject (pAudTarget);
pmt - >释放();
pmt =零;
型bstrSourceFileVid = SysAllocString(文本(“Video-Source.mp4”));
hr = pVidConvert - > put_SourceFile (bstrSourceFileVid);
如果(失败(人力资源)
返回人力资源;
SysFreeString (bstrSourceFileVid);
型bstrSourceFileAud = SysAllocString(文本(“Audio-Source.mpg”));
hr = pAudConvert - > put_SourceFile (bstrSourceFileAud);
如果(失败(人力资源)
返回人力资源;
SysFreeString (bstrSourceFileAud);
pVidConvert - > StartConvert ();
pAudConvert - > StartConvert ();
hr = CombineFiles (pVidTarget、pAudTarget、文本(“Combined-File.mpg”));
长lState = 0;
pVidConvert - > get_State (&lState);
如果(lState = = ltmmConvert_State:: ltmmConvert_State_Running)
pVidConvert - > StopConvert ();
lState = 0;
pAudConvert - > get_State (&lState);
如果(lState = = ltmmConvert_State:: ltmmConvert_State_Running)
pAudConvert - > StopConvert ();
pVidTarget - >释放();
pVidTarget =零;
pAudTarget - >释放();
pAudTarget =零;
pAudConvert - >释放();
pVidConvert - >释放();
返回人力资源;
}
按运行项目F5,或通过选择调试- >开始调试。
如果遵循正确的步骤,应用程序运行并将音频和视频源文件转换成一个媒体文件。如果使用上面的示例文件,这将是预期的输出媒体文件。
本教程展示了如何结合两个媒体文件,一个视频和音频,一个文件使用ltmmConvert
对象。