下边的内容将具体指导您进行创建根据桌面上提示框的手机应用程序的全过程,该应用软件可用于互相转换音频文件。包含:
“engine”-一个类库,用于从一种格式到另一种格式的具体转换
枚举类型给出途径中的文档及其在其中的一切子文件夹名称。
操作界面和客户体验
我开发设计的程序流程无需组装就可以运作,无需外界DLL,乃至不用静态数据库。只需搭建并运作就可以。
环境
MicrosoftMediaFoundation是一个根据Windows的多媒体系统服务平台,使开发者可以创建各种各样多媒体课件。
转换音频文件
应用MicrosoftMediaFoundation转换音频文件必须对声频流开展代码和编解码,这将在下列实例教程中开展表明。
第一步是为该类音频处理创建我们自己的类,大家称作SG_Audio(Convert)。
SG_AudioConvert::SG_AudioConvert()
{
// Initialize whatever needs to be initialized
Init();
}
SG_AudioConvert::~SG_AudioConvert()
{
// Clean up whatever needs to be cleaned up
Cleanup();
}1234567891011复制代码种类:[c]
复位中
大家的Init()作用由结构启用,实行下列实际操作:
查验它是不是已经根据复位。我们不期待(都不应当)多次那样做。
启用HeapSetInformation()为咱们的堆开启一些作用。小心,大家正在初始化单核模块,您可以在这篇优异的内容中掌握相关该专业术语的其他信息。
启用MFStartup()以运行WindowsMediaFoundation。
设定m_bInit为true,表明复位已经完成。
int SG_AudioConvert::Init()
{
HRESULT hr = S_OK;
// check already initialized
if (m_bInit)
return RET_OK;
(void)HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
hr = MFStartup(MF_VERSION);
m_bInit = TRUE;
return RET_OK; // success
}
m_bInit = FALSE;
return RET_FAIL; // fail
}12345678910111213141516171819202122复制代码种类:[c]
清扫整洁
在接着以前,大家还介绍一下我们类的Destructor启用的清除全过程。
int SG_AudioConvert::Cleanup()
{
MFShutdown();
CoUninitialize();
return RET_OK; // success
}1234567复制代码种类:[c]
在清除流程中,大家实行下列实际操作:
打电话MFShutdown()
通话CoUninitialize()
大家的通用性声频转换作用
大家开发设计
intSG_AudioConvert::ConvertProc()以将全部文档转换从适用的一切声频种类转换为别的一切种类。
大家将下列传参给它:
p_szSrc-大家的源代码
p_szDst-大家的总体目标文档
TargetFormat-大家总体目标格式的GUID-客户程序“音频编解码器”
ContainerType-大家的器皿种类-客户程序“文档器皿”
该函数公式的原形如下所示所显示:
int SG_AudioConvert::ConvertProc(
const wchar_t* p_szSrc,
const wchar_t* p_szDst,
const GUID TargetFormat,
const GUID ContainerType);12345复制代码种类:[c]
转换
大家的通用性转换函数公式如下所示所显示:ConvertProc()
注:WriteLogFile()是在叙述我的旧的日志纪录作用之一这一文章内容。
int SG_AudioConvert::ConvertProc(const wchar_t* p_szSrc, const wchar_t* p_szDst,
const GUID TargetFormat, const GUID ContainerType)
{
CTranscoder transcoder;
HRESULT hr = S_OK;
// Create a media source for the input file.
hr = transcoder.OpenFile(p_szSrc);
if (SUCCEEDED(hr))
{
//Configure the profile and build a topology.
hr = transcoder.ConfigureAudioOutput(TargetFormat);
}
else
{
return RET_INPUT_FAIL; // open input file fail
}
if (SUCCEEDED(hr))
{
hr = transcoder.ConfigureContainer(ContainerType);
}
//Transcode and generate the output file.
if (SUCCEEDED(hr))
{
hr = transcoder.EncodeToFile(p_szDst);
}
if (SUCCEEDED(hr))
{
WriteLogFile(L\"Output file created: %sn\", p_szDst);
}
else
{
WriteLogFile(L\"Output file was not created due to error: %sn\", p_szDst);
}
if (!SUCCEEDED(hr))
{
return RET_ENC_FAIL; // encoding failed
}
return RET_OK; // encoding success
}123456789101112131415161718192021222324252627282930313233343536373839404142434445复制代码种类:[c]
大家的转换作用
这也是人们的转换函数公式:
下列六个作用包含了下列声频格式的每一种组成中间的转换:.mp3,.wav和.m4a。
// Convert to MP3
int SG_AudioConvert::Wav_to_Mp3(const wchar_t* p_szWavFile, const wchar_t* p_szMp3File)
{
// check initialize
if (!m_bInit)
return RET_NOT_INIT;
// convert
return(ConvertProc(p_szWavFile, p_szMp3File,
MFAudioFormat_MP3, MFTranscodeContainerType_MP3));
}
int SG_AudioConvert::M4A_to_Mp3(const wchar_t* p_szM4AFile, const wchar_t* p_szMp3File)
{
// check initialize
if (!m_bInit)
return RET_NOT_INIT;
// Convert
return(ConvertProc(p_szM4AFile, p_szMp3File,
MFAudioFormat_MP3, MFTranscodeContainerType_MP3));
}
// Convert to M4A
int SG_AudioConvert::Wav_to_M4A(const wchar_t* p_szWavFile, const wchar_t* p_szM4AFile)
{
// check initialize
if (!m_bInit)
return RET_NOT_INIT;
// Convert
return(ConvertProc(p_szWavFile, p_szM4AFile, MFAudioFormat_AAC,
MFTranscodeContainerType_MPEG4));
}
int SG_AudioConvert::MP3_to_M4A(const wchar_t* p_szMp3File, const wchar_t* p_szM4AFile)
{
// check initialize
if (!m_bInit)
return RET_NOT_INIT;
// Convert
return(ConvertProc(p_szMp3File, p_szM4AFile,MFAudioFormat_AAC,
MFTranscodeContainerType_MPEG4));
}
// Convert to Wav
int SG_AudioConvert::MP3_to_Wav(const wchar_t* p_szMp3File, const wchar_t* p_szWavFile)
{
// check initialize
if (!m_bInit)
return RET_NOT_INIT;
// Convert
return(ConvertProc(p_szMp3File, p_szWavFile, MFAudioFormat_PCM,
MFTranscodeContainerType_WAVE));
}
int SG_AudioConvert::M4A_to_Wav(const wchar_t* p_szM4AFile, const wchar_t* p_szWavFile)
{
// check initialize
if (!m_bInit)
return RET_NOT_INIT;
// Convert
return(ConvertProc(p_szM4AFile, p_szWavFile, MFAudioFormat_PCM,
MFTranscodeContainerType_WAVE));
}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768复制代码类型:[c]
大家的文件搜索体制
我最近更新了一些旧编码(感激LoukaDiagnekov)来适用当代应用软件,包含UNICODE字符串数组,而且该代码托管在这里储存库文件。
该类的一个很好的功用是可以在一个检索中设定好几个查看的作用。大家还能够递归法地扫描仪文件夹名称以及子文件夹名称,以搜索与人们的规范相符合的文档。
这也是struct运作检索以前录入的具体内容。小心,当牵涉到数百万个文档时,该类有点儿慢,可是就大家的音频转换器专用工具来讲,它可以正常的工作中。
// Specifies settings to use for searching for files
struct FindFileOptions_t
{
bool recursive; // Whether to look inside subdirectories
bool returnFolders; // Return folder names as results too
bool *terminateValue; // Value to check to see whether search should be
// terminated
wstring location; // Where to search for files
wstring filter; // Filter for files to be included
wstring excludeFile; // Exclude filter for files
wstring excludeDir; // Exclude filter for directories
};12345678910111213141516复制代码类型:[c]
大家的运营模式
大家界定了9种操控方式,可以将一种或二种文件格式密秘变换为第三种。那样,我们可以在给出途径中检索一种或二种类型的文档,并在寻找时将其变换为第三种文件格式。
typedef enum
{
M4A_WAV_TO_MP3 = 0, // convert m4a and wav to mp3
MP3_M4A_TO_WAV = 1, // convert mp3 and m4a to wav
MP3_WAV_TO_M4A = 2, // convert mp3 and wav to m4a
M4A_TO_MP3 = 3, // convert m4a to mp3
WAV_TO_MP3 = 4, // convert wav to mp3
MP3_TO_WAV = 5, // convert mp3 to wav
M4A_TO_WAV = 6, // convert m4a to wav
WAV_TO_M4A = 7, // convert wav to m4a
MP3_TO_M4A = 8, // convert mp3 to m4a
LAST_ELEMENT = 9
} OperationMode;1234567891011121314复制代码类型:[c]
使我们选用一种“实际操作方式”并对它进行详细描述。例如,MP3_WAV_TO_M4A。
在这里方式下,大家期待在给出途径中检索.mp3和.wav文件,并将全部寻找的文件格式转换为m4a。
挑选此方式后,大家将实行下列实际操作:
应用下列查看搜索文件:
#define QUERY_MP3_WAV L\"*.mp3;*.wav\";1复制代码类型:[cpp]
因而,返回人们的FindFile课程内容,大家将其设定为:
opts.filter = QUERY_MP3_WAV;1复制代码类型:[cpp]
随后,大家启用:
scanPath(wstring path)1复制代码类型:[cpp]
逐渐大家的文件搜索。检索结束后,大家将获得一个二维数组,在其中包括全部寻找的文档,随后将这种文件格式转换为咱们的总体目标声频类型。
操作界面
此软件根据基于Dialog的MFC应用软件。提示框可调节尺寸,而且每一次调节提示框大钟头都是会调节每一个原素。这也是应用MarcRicharme的下列文章内容中的一些十分历史悠久(但稳如泰山)的源代码完成的。提示框也是有其自身的肌肤,背景色,全透明原素,因而它看上去比规范MFC应用软件更强。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。