结合视频和音频从不同来源——Windows c++

本教程展示如何使用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++教程中,完成添加引用和设置一个许可证教程。

创建项目并添加多媒体头和LIB文件188宝金博怎么下载

开始的一个副本64位Windows API创建的项目添加引用和设置一个许可证教程。如果项目不可用,按照这个教程中的步骤创建它。

为了使用ltmmConvert对象,LEADTOOLS需要额外的引用。添加所需的多媒体库通过打开预编译头188宝金博怎么下载文件的引用,pch.hstdafx.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, const TCHAR * pszCompressorName)

无效SelectCompressor (IltmmCompressors * pCompressors,常量TCHAR * pszCompressorName){指数;型bstrCompressorName = SysAllocString (pszCompressorName);pCompressors - >找到(bstrCompressorName、和);pCompressors - > put_Selection(指数);SysFreeString (bstrCompressorName);}

CombineFiles (IltmmSampleTarget * pVideoTarget IltmmSampleTarget * pAudioTarget, const TCHAR * _targetFile)

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 - >释放();返回人力资源;}

CombineAudioandVideo ()

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对象。

另请参阅

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