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

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

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

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

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

用户界面和用户体验

我开发的程序无需安装即可运行,无需外部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]

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

用户界面

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

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

秒鲨号所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈!本站将在三个工作日内改正。
(0)

大家都在看

  • 个人交社保怎么交(个人社保怎么缴纳)

    自己缴纳社保有两种方式可以选择,第一种是社保挂靠;第二种就是灵活就业身份缴纳 第一种社保代缴 社保代缴机构挂靠,这种跟熟人公司挂靠一样,只需要把企业和个人缴纳部分转给社保代缴公司即…

    2022年5月11日
  • 新款超薄手机(超薄手机排名)

    智能手机可以做很多事,办公、购物、娱乐样样精通,据QuestMobile调查,现代人均单日使用时长达289.7分钟接近5小时,可以说除了睡觉的时候,我们都在跟手机打交道。 所以使用…

    2022年3月5日 投稿
  • 苹果有什么游戏好玩(苹果手机必玩的游戏)

    转眼到了十二月,各种盘点汇总信息/年度榜单扑面而来。苹果也公布了其2021年的精选游戏排行榜。不出意外《英雄联盟》成为了iPhone平台的年度热门游戏,一起来看。 今年苹果年度精选…

    2022年3月5日 投稿
  • word中打钩怎么打(电脑word里面打钩的步骤)

    很多朋友在编辑文档的时候都需要用到在方框内显示打钩的效果,或者点击一下方框才打钩这种效果,那么这两种该怎么操作呢,我们一起来看一下吧 首先我们输入大写的R和Q : 在字体中输入Wi…

    2022年5月3日 投稿
  • 基金如何买(怎么样买基金啊)

    小白买基金,经常越买越多。 白酒医药新能源、电子军工半导体、钢铁煤炭原材料。 只要涨了都想买。 或者看了很多大V的测评、某宝、某天首页推荐的“牛基”。 觉得都很不错,买。 美其名曰…

    2022年5月10日 投稿
  • 系统封装工具及教程(封装系统详细步骤)

    在上期重装系统的教程中,很多同学想知道如何封装系统,恰好我也会,今天为大家带来最简单的系统封装教程。 准备工具:VM虚拟机win10原版镜像 微软官网免费下载EasySysprep…

    2022年2月28日 投稿
  • 十大网游小说排行榜(十大网游小说排行榜2019)

    有时候特别喜欢看网游竞技类的小说,最近在书旗小说又重温了一本,顾漫的《微微一笑很倾城》,还是觉得很精彩,回想一下,过去20年来,其实有着不少的经典网游小说。下面根据印象说一说。 1…

    2022年6月8日
  • 口碑最好的行车记录仪(哪个牌子行车记录仪最好)

    新买了一辆车,最近一直在纠结到底买哪个行车记录仪,网上太多了,每家的介绍貌似都很不错,价格也是有高有低,就是看了一圈下来实在头大,都不知道选哪一款好了, 请教下有没有口碑好点,价格…

    2022年5月9日 投稿
  • 老赖黑名单查询的方法(2021年失信人员黑名单查询)

    在生活中、工作中,我们发现现在需要查询一个人或一个公司是不是“老赖”的频率越来越频繁了。 那么,你知道怎样查询老赖吗? 你知道怎样查询老赖方法最简单吗? 以前,我总是喜欢打开收藏的…

    2022年5月29日
  • 医保卡社保卡合一了吗(医保和社保是一张卡吗)

    在办理退休时,工作人员会告诉群众带着社保卡,有的人就比较困惑,社保卡是什么?医保卡和社保卡是一张卡吗? 现在,医保卡和社保卡就是同一张卡,又称一卡通,社保卡的功能十分齐全,通过它可…

    2022年4月11日
品牌推广 在线咨询
返回顶部