肥宅钓鱼网
当前位置: 首页 钓鱼百科

m4a转换成文字(免费的手机录音m4a转换mp3的方法)

时间:2023-08-15 作者: 小编 阅读量: 20 栏目名: 钓鱼百科

下面的文章将指导您完成创建基于桌面对话框的应用程序的过程,该应用程序可用于相互转换音频文件。只需构建并运行即可。背景MicrosoftMediaFoundation是一个基于Windows的多媒体平台,使开发人员能够创建各种多媒体软件。转换音频文件使用MicrosoftMediaFoundation转换音频文件需要对音频流进行编码和解码,这将在以下教程中进行说明。第一步是为此类音频处理创建我们自己的类,我们称之为SG_Audio。我们不希望多次这样做。设置m_bInit为true,表示初始化已完成。

下面的文章将指导您完成创建基于桌面对话框的应用程序的过程,该应用程序可用于相互转换音频文件。包括:

“engine”-一个类库,用于从一种格式到另一种格式的实际转换

枚举给定路径中的文件以及其中的任何子文件夹。

用户界面和用户体验

我开发的程序无需安装即可运行,无需外部DLL,甚至不需要静态库。只需构建并运行即可。

背景

MicrosoftMediaFoundation是一个基于Windows的多媒体平台,使开发人员能够创建各种多媒体软件。

转换音频文件

使用MicrosoftMediaFoundation转换音频文件需要对音频流进行编码和解码,这将在以下教程中进行说明。

第一步是为此类音频处理创建我们自己的类,我们称之为SG_Audio(Convert)。

SG_AudioConvert::SG_AudioConvert(){// Initialize whatever needs to be initializedInit();}SG_AudioConvert::~SG_AudioConvert(){// Clean up whatever needs to be cleaned upCleanup();}1234567891011复制代码类型:[c]

初始化中

我们的Init()功能由构造调用,执行以下操作:

检查它是否已经通过初始化。我们不希望(也不应该)多次这样做。

调用HeapSetInformation()为我们的堆启用某些功能。请注意,我们正在初始化单线程单元,您可以在这篇出色的文章中了解有关该术语的更多信息。

调用MFStartup()以启动WindowsMediaFoundation。

设置m_bInit为true,表示初始化已完成。

int SG_AudioConvert::Init(){HRESULT hr = S_OK;// check already initializedif (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 MP3int SG_AudioConvert::Wav_to_Mp3(const wchar_t* p_szWavFile, const wchar_t* p_szMp3File){// check initializeif (!m_bInit)return RET_NOT_INIT;// convertreturn(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 initializeif (!m_bInit)return RET_NOT_INIT;// Convertreturn(ConvertProc(p_szM4AFile, p_szMp3File,MFAudioFormat_MP3, MFTranscodeContainerType_MP3));}// Convert to M4Aint SG_AudioConvert::Wav_to_M4A(const wchar_t* p_szWavFile, const wchar_t* p_szM4AFile){// check initializeif (!m_bInit)return RET_NOT_INIT;// Convertreturn(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 initializeif (!m_bInit)return RET_NOT_INIT;// Convertreturn(ConvertProc(p_szMp3File, p_szM4AFile,MFAudioFormat_AAC,MFTranscodeContainerType_MPEG4));}// Convert to Wavint SG_AudioConvert::MP3_to_Wav(const wchar_t* p_szMp3File, const wchar_t* p_szWavFile){// check initializeif (!m_bInit)return RET_NOT_INIT;// Convertreturn(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 initializeif (!m_bInit)return RET_NOT_INIT;// Convertreturn(ConvertProc(p_szM4AFile, p_szWavFile, MFAudioFormat_PCM,MFTranscodeContainerType_WAVE));}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768复制代码类型:[c]

我们的文件搜索机制

我最近更新了一些旧代码(感谢LoukaDiagnekov)来支持现代应用程序,包括UNICODE字符串,并且该代码托管在此存储库中。

此类的一个不错的功能是可以在一个搜索中设置多个查询的功能。我们还可以递归地扫描文件夹及其子文件夹,以查找与我们的标准相匹配的文件。

这是struct运行搜索之前填写的主要内容。请注意,当涉及到数百万个文件时,此类有点慢,但是就我们的音频转换器工具而言,它可以正常工作。

// Specifies settings to use for searching for filesstruct FindFileOptions_t{bool recursive;// Whether to look inside subdirectoriesbool returnFolders;// Return folder names as results toobool *terminateValue;// Value to check to see whether search should be// terminatedwstring location;// Where to search for fileswstring filter;// Filter for files to be includedwstring excludeFile;// Exclude filter for fileswstring excludeDir;// Exclude filter for directories};12345678910111213141516复制代码类型:[c]

我们的运作模式

我们定义了9种操作模式,可以将一种或两种格式秘密转换为第三种。这样,我们可以在给定路径中搜索一种或两种类型的文件,并在找到时将其转换为第三种格式。

typedef enum{M4A_WAV_TO_MP3 = 0,// convert m4a and wav to mp3MP3_M4A_TO_WAV = 1,// convert mp3 and m4a to wavMP3_WAV_TO_M4A = 2,// convert mp3 and wav to m4aM4A_TO_MP3 = 3,// convert m4a to mp3WAV_TO_MP3 = 4,// convert wav to mp3MP3_TO_WAV = 5,// convert mp3 to wavM4A_TO_WAV = 6,// convert m4a to wavWAV_TO_M4A = 7,// convert wav to m4aMP3_TO_M4A = 8,// convert mp3 to m4aLAST_ELEMENT = 9} OperationMode;1234567891011121314复制代码类型:[c]

让我们采用一种“操作模式”并对其进行详细说明。例如,MP3_WAV_TO_M4A。

在此模式下,我们希望在给定路径中搜索.mp3和.wav文件,并将所有找到的文件转换为m4a。

选择此模式后,我们将执行以下操作:

使用以下查询搜索文件:

#define QUERY_MP3_WAVL"*.mp3;*.wav";1复制代码类型:[cpp]

因此,回到我们的FindFile课程,我们将其设置为:

opts.filter = QUERY_MP3_WAV;1复制代码类型:[cpp]

然后,我们调用:

scanPath(wstring path)1复制代码类型:[cpp]

开始我们的文件搜索。搜索完成后,我们将得到一个数组,其中包含所有找到的文件,然后将这些文件转换为我们的目标音频类型。

用户界面

该软件基于基于Dialog的MFC应用程序。对话框可调整大小,并且每次调整对话框大小时都会调整每个元素。这是使用MarcRicharme的以下文章中的一些非常古老(但坚如磐石)的代码实现的。对话框也有其自己的皮肤,背景颜色,透明元素,因此它看起来比标准MFC应用程序更好。

    推荐阅读
  • 学生适合用的护肤品什么牌子(分享一些适合学生用的护肤品)

    而且气味很迷。。氨基酸洁面,我一般把它当晨洁,味道太香,不能接受,性价比很高。这款洗面奶购于tao宝:水泊兰超膜店,买洗面奶送爽肤水理肤泉、雅漾、依泉、欧缇丽喷雾除了理肤泉,其他3种用到后来喷头都会一注一注喷出来,很不好。欧缇丽的喷头用久了会发黄。质地是偏向于半固体泥的状态,很好推,用手指就能很好的延展开。

  • 象首领是雄象吗(首领还是雌象?)

    以下内容希望对你有帮助!象首领是雄象吗大象是母系社会,首领是年龄最大的雌象,因为它经验最丰富,最能靠它的头脑而不是力量领导象群。雄象成年后就会离开象群独立生存,只有在交配期才会暂时加入一个象群,很快就会离开,不会去做首领。雄象争斗只是争夺交配权。

  • 谢怜为什么要去半月关(谢怜去半月关的原因)

    谢怜为什么要去半月关《天官赐福》谢怜原本就去过半月关所以想要回去。谢怜原本在半月关受尽了苦楚,正是因为这样的环境才锻炼出谢怜这样伟大的人。谢怜心里知道这些人都想要杀死他,他也知道这件事情是个圈套,但是他依旧决定要去半月关,他想要通过自己的努力平定半月关的战乱,让那里的百姓们不再受苦。

  • 减肥必须做有氧运动吗(减肥可以做有氧运动吗)

    有氧运动时间过长不易燃烧体脂其实肾上腺压力就跟日常生活的种种压力一样,都会导致身体分泌皮质醇,而皮质醇就是帮助我们身体节省糖类消耗,以备未来身体在更严峻状况下可使用的一种内分泌物。间歇运动可有效提升能力事实上,想有好的心肺功能,而且在降低体脂率的同时保有强健的肌肉,更好的选择就是间歇运动。让身体达到更强的、新的供能水平。

  • 美团王兴财富专访(美团正式杀入信用支付)

    今日,美团官方对外发布消息称,只要年满年满18周岁,且完成实名认证的美团活跃打开美团app,首页搜索“美团月付”便可申请开通该款产品。此外,美团称“月付”还支持账单延期还款和账单分期还款,最长可分12期。美团在发布“月付”上线的公开消息中披露,目前,用户对月付的使用意愿在不断增强。王蓬博称,美团利用金融和支付入口的方式,可把外卖餐饮,到店酒旅等业务形成闭环。

  • 王者荣耀凛冬怎么合成 王者荣耀怎么出凛冬

    2、可以先出,然后在后期的团战中死掉两次,随后复活甲就会自动变为,这个时候装备栏就会弹出一个的图标,点击后就能成功购置这件二级装备了。

  • 果实累累的拼音(果实累累怎么读)

    guǒshíléiléi果实累累,此处读léi累累:连续成串又如:累赘;用于积累、连累、连篇累牍、罪行累累等读lěi)指积累的多,比喻巨大的成绩或荣誉,今天小编就来说说关于果实累累的拼音?果实累累的拼音guǒshíléiléi。)指积累的多,比喻巨大的成绩或荣誉。léiléi(形)〈书〉憔悴颓丧的样子。lěilěi(副)屡屡。(形)形容累积得多。(作谓语)另见“累léi”下“累累”。那棵树上真是果实累累的秋天。

  • 斯诺克球桌尺寸多少(标准的斯诺克球桌的尺寸是多少)

    斯诺克球桌尺寸多少?斯诺克球桌尺寸多少斯诺克(司诺克)台球桌尺寸:3820*2035*850mm,美式落袋台球桌尺寸:2810*1530*850mm,花式九球台球桌尺寸:2850*1580*850mm。精神状态度要好,睡眠不足或心里有事儿,不要打台球。记住,台球是专注度要求极高的运动。如果害怕失败,同样,远离台球。虚心的态度,平和的心态。胜不骄,败不躁。一句话,绅士风度。不懂得赞美别人,太看重输赢的人,请远离台球。

  • 坚持运动对骨骼有好处吗(青少年就该多做运动)

    另外,青少年关节中软骨也没有发育成熟,长期过度磨损膝盖软骨可能会导致成年后患骨质增生,甚至造成半月板损伤和关节炎等。特别是患有先天性脑血管畸形的青少年,盲目倒立易造成颅内出血。温馨提示除了以上几种运动外,兔子跳也并不适合青少年,因为此运动可增加膝关节所承受的压力,稍有不慎可能会使得关节半月板损伤。

  • 初中生祛除痘痘小妙招(初中生祛除痘痘需要注意什么)

    初中生祛除痘痘小妙招调理内分泌。情况特别严重的孩子,完全可以到医院让医生开具一些调理内分泌的中药,配合日常的皮肤清洁护理,来消除青春痘。通过调理内分泌失调来去除青春痘,可以非常有效的防止青春痘、痘痘的复发。中学生脸上长了青春痘,在日常的皮肤清洁过程中,一定要认真。不要用太过刺激的洗面奶,床单枕套毛巾等要勤换洗,可以使用一次性的洗脸巾来擦脸。通过控制脸部油脂分泌,减少青春痘出现的可能。