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

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应用程序更好。

    推荐阅读
  • dota2ti10lgd最后阵容(DOTA2伯明翰站回顾RTZ秀翻LGD)

    凭借着这个BO2的完胜,LGD保住了胜者组的席位。双方的第一局比赛,LGD在最后一手点出了Maybe的女王。由于大招附带击退效果,EG两人组对LGD的Gank基本上都以失败告终。白牛迅速锁定位置,Sumail二连跟上,花仙子的恐吓稍微晚了一点,Maybe阵亡。比赛在39分钟告一段落,LGD输的毫无办法。败者组方面,手感回升的秘密连斩TNC和红星,他们很快就会同LGD碰面。拿到不朽盾后,敌法师成为了红星的噩梦。

  • 二类卡转入50000会怎样(银行系统会自动做退回处理)

    下面更多详细答案一起来看看吧!二类卡转入50000会怎样5万元已经超出二类卡的日限额了,肯定是无法入账的,银行系统会自动做退回处理。银行二类卡,不论是转账、存款还是取款或者消费都是有限额。消费、缴费、向非绑定账户转出资金,取出现金日累计限额是1万元,年累计限为20万元。

  • 化妆后刷子需要清洗吗(终于知道化妆师)

    身边的专业化妆师告诉我,美妆蛋已经被业内封杀了。因为美妆蛋不仅爱吃粉,上妆慢不说。不仅没有吃粉的问题,而且妆效也要比美妆蛋更加清透自然。同时还能让妆容变服帖,分分钟都想让你放弃美妆蛋!

  • 威士忌怎么保存(威士忌的保存方法)

    而威士忌的橡木塞不像葡萄酒那样需要开瓶器才能打开,这种橡木塞不具有膨胀性所以可以重复使用,十分方便,但是缺点就是密闭性差,平放时会被酒精腐蚀,加速酒精和香气的流失。但直立放置的酒瓶又导致木塞长期干燥着,容易断裂,所以要随时有备用酒塞。将威士忌放在冰箱里容易使威士忌温度过低,在饮用时会减弱风味和香气。这些都可能使威士忌的香味分子发生变化,所以不建议在冰箱中保存。

  • 长安汽车如何连接手机播放音乐(具体的操作流程这里有)

    下面更多详细答案一起来看看吧!长安汽车如何连接手机播放音乐按车载多媒体机面板的蓝牙按钮,或从主界面进入,开启车载蓝牙。打开手机的蓝牙功能,并将手机蓝牙设置为“所有人可见”或可被搜索或开放检测。在手机中搜索蓝牙设备,查找到之后选中进行配对连接,如提示需输入密码,则输入配对密码为:0000,完成配对后则连接成功。

  • 一等奖美丽校园手抄报作品二年级(贵阳市中小学生德育手抄报竞赛)

    一等奖美丽校园手抄报作品二年级本报讯经过初评、网络投票和专家评审,由贵阳市教育局、贵阳日报传媒集团主办的“贵阳市第十届中小学生德育手抄报竞赛”活动,拟评50件作品分别获得中小学组的一、二、三等奖,现予以公示。据介绍,活动自今年1月启动以来,共收到贵阳市十个区县市130所学校的中小学生累计1800余份手抄报作品。从即日起至5月22日止进行为期7天的公示。

  • 李白有逼格的诗(李白的噫吁嚱)

    日前,由西南交通大学教授汪启明领衔撰写的《中上古蜀语考论》获第十八届“北京大学王力语言学奖”一等奖。根据地域名称及行政归属的演变,把中上古时期的蜀地人语称为“蜀语”,把宋元明时代蜀地人语称为“蜀方言”,把清代以后的蜀地人语称为“四川方言”。据了解,学界称《中上古蜀语考论》为中上古蜀语研究的开山之作,也是基于该书落笔在研究语言,意又在语言之外。

  • 吉利汽车远景X3蓝牙手机怎么互联(吉利远景x3手机连接车载蓝牙放歌)

    调试USB,连接成功后扫描屏幕上的二维码,下载APP,完成安装。手机互联是指手机可以通过USB、蓝牙或WIFI与车载系统连接。配置方面,VisionX3的配置比较实用,比如一键启动、巡航控制、胎压监测、自动大灯等越级配置,性价比相当高。远景X3的行李容量为400LL,后排座椅放下后,空的空间可以进一步扩大。此外,车内还有很多储物间空,也可以划分功能区,避免混乱。这辆车空车厢的设计非常合理,坐进去也不局促。

  • 波棱盖是什么意思(波棱盖的含义)

    波的解释波ō水面振荡起伏的运动:波浪波涛波澜波光波纹波荡推波助澜波及,我来为大家讲解一下关于波棱盖是什么意思?跟着小编一起来看一看吧!波棱盖是什么意思波的解释波ō水面振荡起伏的运动:波浪。物理学上指振动在物质中的传播能量递进的一种形式:电波。

  • 当男人撩你的时候该怎么办(会让男人对你上瘾)

    众所周知,邓超和孙俪是出了名的恩爱夫妻。而邓超之所以对娘娘孙俪没有二心,是因为孙俪懂得利用距离,让邓超念念不忘。同样的,作为模范夫妻的张杰和谢娜。然而,再乐观的人,也会因为一次又一次的打击而心生退意,小曼也不例外。可现实总是差强人意,面对开朗大方的小曼,男神不仅没有欣然接受,反而觉得小曼过于聒噪。终于,面对男神的冷漠,小曼再也坚持不下去了。