`
Poechant
  • 浏览: 227603 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24243
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22051
社区版块
存档分类
最新评论

音频编解码·实战篇(1)WAV转至AAC(AAC编码)

阅读更多

音频编解码·实战篇(1)WAV转至AAC(AAC编码)

  • 作者:柳大·Poechant
  • 博客:blog.csdn.net/poechant
  • 邮箱:zhongchao.ustc@gmail.com
  • 日期:April 7th, 2012

这里利用FAAC来实现AAC编码。另外,WAV的数据段是PCM,代码会出现很多PCM缩写。

1 下载安装 FAAC

这里的安装过程是在 Mac 和 Linux 上实现的,Windows可以类似参考。

wget http://downloads.sourceforge.net/faac/faac-1.28.tar.gz
tar zxvf faac-1.28.tar.gz
cd faac-1.28
./configure
make
sudo make install

如果才用默认的 configure 中的 prefix path,那么安装后的 lib 和 .h 文件分别在/usr/local/lib/usr/local/include,后面编译的时候会用到。

2 FAAC API

2.1 Open FAAC engine

Prototype:

faacEncHandle faacEncOpen               // 返回一个FAAC的handle
(                   
    unsigned long   nSampleRate,        // 采样率,单位是bps
    unsigned long   nChannels,          // 声道,1为单声道,2为双声道
    unsigned long   &nInputSamples,     // 传引用,得到每次调用编码时所应接收的原始数据长度
    unsigned long   &nMaxOutputBytes    // 传引用,得到每次调用编码时生成的AAC数据的最大长度
);

2.2 Get/Set encoding configuration

Prototype:

获取编码器的配置:

faacEncConfigurationPtr faacEncGetCurrentConfiguration // 得到指向当前编码器配置的指针
(
    faacEncHandle hEncoder  // FAAC的handle
);

设定编码器的配置:

int FAACAPI faacEncSetConfiguration
(
    faacDecHandle hDecoder,         // 此前得到的FAAC的handle
    faacEncConfigurationPtr config  // FAAC编码器的配置
);

2.3 Encode

Prototype:

int faacEncEncode
(
    faacEncHandle hEncoder,     // FAAC的handle
    short *inputBuffer,         // WAV原始数据
    unsigned int samplesInput,  // 调用faacEncOpen时得到的nInputSamples值
    unsigned char *outputBuffer,// 至少具有调用faacEncOpen时得到的nMaxOutputBytes字节长度的缓冲区
    unsigned int bufferSize     // outputBuffer缓冲区的实际大小
);

2.4 Close FAAC engine

Prototype

void faacEncClose
(
    faacEncHandle hEncoder  // 此前得到的FAAC handle
);

3 流程

3.1 做什么准备?

采样率,声道数(双声道还是单声道?),还有你的WAV的单个样本是8位的还是16位的?

3.2 开启FAAC编码器,做编码前的准备

  1. 调用faacEncOpen开启FAAC编码器后,得到了单次输入样本数nInputSamples和输出数据最大字节数nMaxOutputBytes
  2. 根据nInputSamplesnMaxOutputBytes,分别为WAV数据和将要得到的AAC数据创建缓冲区;
  3. 调用faacEncGetCurrentConfiguration获取当前配置,修改完配置后,调用faacEncSetConfiguration设置新配置。

3.3 开始编码

调用faacEncEncode,该准备的刚才都准备好了,很简单。

3.4 善后

关闭编码器,另外别忘了释放缓冲区,如果使用了文件流,也别忘记了关闭。

4 测试程序

4.1 完整代码

WAV格式音频文件/home/michael/Development/testspace/in.wav转至AAC格式文件/home/michael/Development/testspace/out.aac

#include <faac.h>
#include <stdio.h>

typedef unsigned long   ULONG;
typedef unsigned int    UINT;
typedef unsigned char   BYTE;
typedef char            _TCHAR;

int main(int argc, _TCHAR* argv[])
{
    ULONG nSampleRate = 11025;  // 采样率
    UINT nChannels = 1;         // 声道数
    UINT nPCMBitSize = 16;      // 单样本位数
    ULONG nInputSamples = 0;
    ULONG nMaxOutputBytes = 0;

    int nRet;
    faacEncHandle hEncoder;
    faacEncConfigurationPtr pConfiguration; 

    int nBytesRead;
    int nPCMBufferSize;
    BYTE* pbPCMBuffer;
    BYTE* pbAACBuffer;

    FILE* fpIn; // WAV file for input
    FILE* fpOut; // AAC file for output

    fpIn = fopen("/home/michael/Development/testspace/in.wav", "rb");
    fpOut = fopen("/home/michael/Development/testspace/out.aac", "wb");

    // (1) Open FAAC engine
    hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);
    if(hEncoder == NULL)
    {
        printf("[ERROR] Failed to call faacEncOpen()\n");
        return -1;
    }

    nPCMBufferSize = nInputSamples * nPCMBitSize / 8;
    pbPCMBuffer = new BYTE [nPCMBufferSize];
    pbAACBuffer = new BYTE [nMaxOutputBytes];

    // (2.1) Get current encoding configuration
    pConfiguration = faacEncGetCurrentConfiguration(hEncoder);
    pConfiguration->inputFormat = FAAC_INPUT_16BIT;

    // (2.2) Set encoding configuration
    nRet = faacEncSetConfiguration(hEncoder, pConfiguration);

    for(int i = 0; 1; i++)
    {
        // 读入的实际字节数,最大不会超过nPCMBufferSize,一般只有读到文件尾时才不是这个值
        nBytesRead = fread(pbPCMBuffer, 1, nPCMBufferSize, fpIn);

        // 输入样本数,用实际读入字节数计算,一般只有读到文件尾时才不是nPCMBufferSize/(nPCMBitSize/8);
        nInputSamples = nBytesRead / (nPCMBitSize / 8);

        // (3) Encode
        nRet = faacEncEncode(
        hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer, nMaxOutputBytes);

        fwrite(pbAACBuffer, 1, nRet, fpOut);

        printf("%d: faacEncEncode returns %d\n", i, nRet);

        if(nBytesRead <= 0)
        {
            break;
        }
    }

    /*
    while(1)
    {
        // (3) Flushing
        nRet = faacEncEncode(
        hEncoder, (int*) pbPCMBuffer, 0, pbAACBuffer, nMaxOutputBytes);

        if(nRet <= 0)
        {
            break;
        }
    }
    */

    // (4) Close FAAC engine
    nRet = faacEncClose(hEncoder);

    delete[] pbPCMBuffer;
    delete[] pbAACBuffer;
    fclose(fpIn);
    fclose(fpOut);

    //getchar();

    return 0;
}

4.2 编译运行

将上述代码保存为“wav2aac.cpp”文件,然后编译:

g++ wav2aac.cpp -o wav2aac -L/usr/local/lib -lfaac -I/usr/local/include

运行:

./wav2aac

然后就生成了out.aac文件了,听听看吧!~

5 Reference

  1. AudioCoding.com - FAAC
  2. Dogfoot – 재밌는 개발

-

转载请注明来自柳大的CSDN博客:blog.csdn.net/poechant

-

1
1
分享到:
评论

相关推荐

    通过ffmpeg将AAC格式转成WAV格式

    在音视频处理领域,FFmpeg是一个非常强大的开源工具,它提供了丰富的API,支持多种音频和视频格式的编码、解码、转换以及流处理。在这个场景中,我们的目标是使用FFmpeg库将AAC(Advanced Audio Coding)格式的音频...

    AAC编解码C语言实现

    在C语言中实现AAC编解码是一项技术挑战,涉及到数字信号处理、音频编码理论以及软件工程实践。 在C语言中实现AAC编解码,首先需要对AAC编码的基本原理有深入理解。AAC采用了感知音频编码技术,通过量化、预测和熵...

    使用fdk-aac将wav编码为aac

    标题“使用fdk-aac将wav编码为aac”涉及到的核心技术是音频编码,特别是AAC(Advanced Audio Coding)编码,以及如何使用C++编程语言来实现这个过程。在描述中提到的“fdk-aac”是一个高质量的AAC音频编码库,由...

    FAAD2解码AAC,生成PCM文件,转换WAV格式

    在IT领域,音频编码与解码是至关重要的技术,尤其在多媒体处理中。本文将深入讲解如何使用FAAD2解码AAC(Advanced Audio Coding)文件,并生成PCM(Pulse Code Modulation)文件,最终将其转换为WAV格式。首先,我们...

    音频处理基础包括pcm/wav/aac/G711a/G711u

    在音频处理中,经常需要进行格式转换,例如将PCM数据编码为G.711 a/u律编码,或者将AAC音频解码为PCM,再封装成WAV文件。这需要对各个格式的内部结构和编码原理有深入理解。在实际应用中,例如在VoIP(Voice over IP...

    aac编解码.rar

    1. **AAC编码器**:编码器是将原始音频数据转换为AAC格式的工具。常见的开源AAC编码器有FAAC和FFmpeg。FAAC是一款高质量的AAC编码器,而FFmpeg则是一个多媒体处理框架,支持包括AAC在内的多种音频编码格式。 2. **...

    音频解码,分贝计算 适用 wav/mp3/aac 16/24/32bit的音频类型

    音频解码是数字音频处理中的关键技术,它涉及将音频数据从其原始的压缩格式转换为原始的、未压缩的PCM(脉冲编码调制)格式,以便进行进一步的处理或播放。在标题和描述中提到的,这项技术适用于wav、mp3和aac这三种...

    speex音频转pcm和aac

    在音频处理领域,Speex、PCM和AAC是三种常见的音频编码格式,每种都有其特定的应用场景和优势。本文将详细讲解如何将Speex音频转换为PCM和AAC,以及链表类在其中的作用。 首先,让我们了解这三种音频格式: 1. ...

    wav.zip_WAV解码_WAV音频转换播放_wav格式_wav格式解码_wav解码代码

    在IT领域,音频编码与解码是至关重要的技术,特别是在多媒体处理中。WAV(Waveform Audio File Format)是由微软和IBM共同开发的一种无损音频格式,广泛应用于各种操作系统。本压缩包“wav.zip”提供了关于WAV音频...

    FFMPEG实现PCM编码AAC和MP3(采用封装格式实现)

    FFmpeg是一款强大的开源多媒体处理工具,它包含了音视频编解码、封装、转换以及流媒体服务等功能。在本文中,我们将深入探讨如何使用FFmpeg将PCM(脉冲编码调制)编码转换为AAC和MP3两种常见的音频编码格式,同时...

    音频编解码芯片vs1005

    1. **解码器**:支持MP3、WMA、Ogg Vorbis、AAC、HE-AAC、FLAC、WAV PCM等多种音频格式。 2. **编码器**:支持MP3、Ogg Vorbis、WAV PCM编码。 3. **文件I/O**:对SD卡和NAND闪存进行读写操作。 4. **FM调谐器与RDS...

    音频解码实现C++音频解码实现C++

    1. **音频文件格式**:常见的音频文件格式有MP3、WAV、AAC、FLAC等。每种格式都有其特定的编码方式和文件结构,解码时需要了解并解析这些格式的头部信息。 2. **音频编码标准**:例如MP3使用MPEG-1 Audio Layer III...

    C# 音频捕获 音频传输 音频编解码 音频压缩 Lumisoft UDP P2P语音聊天

    3. **音频编解码**:音频编解码是将原始的模拟音频信号转换为数字信号(编码)和反向操作(解码)的过程。常见的音频编解码器有MP3、AAC、Opus和G.711等。C#中可以通过Bass.Net这样的库来处理多种音频编码格式,实现...

    linux环境音频编码

    在Linux环境中进行音频编码,尤其是将.wav格式转换为.aac格式,涉及到许多核心技术和工具。以下是一些关于这个主题的重要知识点: 1. **音频编码格式**:音频编码是为了压缩音频数据,减少存储空间和网络传输的带宽...

    vb音频编解码器dll动态链接库

    VB音频编解码器DLL通常包含了多种音频格式的编码和解码算法,如MP3、WAV、AAC等。 Monoton_DS.dll 可能是这个DLL库的核心部分,负责执行实际的音频处理操作。DLL文件不包含源代码,而是提供了一系列预定义的函数...

    POS机、音频编解码器及电子设备.zip

    常见的音频编解码格式有MP3、AAC、FLAC、WAV等。不同的编解码器在音质、压缩比率和版权保护等方面存在差异,适用于不同的应用场景,如音乐播放、语音通话、音频广播等。 电子设备则是一个广泛的概念,涵盖了所有...

    音频解码编码源代码

    在音频处理领域,编码与解码是至关重要的过程,它们涉及到数字音频的存储、传输和播放。本项目“音频解码编码源代码”提供了一套完整的解决方案,专注于将wav格式的音频文件编码为mp3格式,这在节省存储空间和优化...

    ffmpeg4.3 将AAC音频转WAV音频

    总结来说,将AAC音频转为WAV音频主要涉及FFmpeg的解码和编码过程,以及对输入和输出文件的处理。理解FFmpeg的API和多媒体处理的基本概念是实现这个功能的关键。在实际项目中,你可能还需要处理错误、内存管理和其他...

    visual c++音视频编解码技术及实践的音频实现的源代码

    - **音视频编解码**:编解码是将音频或视频信号转换为数字数据的过程,编码是将模拟信号数字化,解码则是将数字信号还原为模拟信号。 - **音频格式**:常见的音频格式有MP3、WAV、AAC等,每种格式都有其特定的编码...

    G.711播放器和编解码库和转换(包括ulaw和alaw测试文件)

    G.711播放器和编解码库是音频处理领域中的重要工具,主要用于处理符合G.711标准的音频数据。这个压缩包提供的资源包括一个G.711播放器,以及与A-law和U-law编码相关的转换功能,同时还有其他如G.721和G.723等标准的...

Global site tag (gtag.js) - Google Analytics