写点什么

音频知识点(1)- 音频格式之 Monkeys Audio(APE)

作者:liuzhen007
  • 2021 年 11 月 28 日
  • 本文字数:3710 字

    阅读完需:约 12 分钟

音频知识点(1)- 音频格式之 Monkeys Audio(APE)

目录


前言

正文

APE 简介

APE 特点

APE 格式

实战场景

参考文献


导读:今天给大家介绍一种常用的无损音频压缩格式——APE,现在很多原声音乐网站大多使用这种编码格式,因为相较于有损压缩,APE 音频格式能够最大程度还原声音本来的品质和展现效果。

正文

APE 简介

Monkey's Audio,简称 APE,是一种免费和强大的数字音乐压缩格式。不像其他一些方法,如 mp3,ogg,或 lqt 一样,一味的舍弃质量以节省空间。APE 能够完全复制你录制音乐的音频数据信息,这就意味着它听起来总是和原声一模一样,能够 100%复原原始音频效果,是一种无损的音频压缩格式。


尽管 APE 声音非常完美,但它仍然节省了大量内存空间。它并不是一个纯 PCM 音频数据集合,而是像一个压缩包,你可以随时将你的 APE 音频文件解压还原成原始音频文件,非常的方便。

APE 特点

APE 音频编码具有如下特点:


0)高效(快速和巨大的压缩)

1)绝对没有质量损失(无损压缩)

2)Media Center、Winamp 及更多播放器都支持

3)Windows 环境界面既强大又易于使用

4)它包含冗余的 CRC 以确保数据的正确解压缩(错误永远不会被忽视)

5)标签支持-APE 的音频使用自己的 APE 标签,所以你可以管理和编目你的 APE 音频

6)外部编码器的支持

7)要用 Nero 刻录 APE 文件,需要 Nero-APE 插件



APE 格式

APE 格式的音频有哪些特点呢?我们如何区分一段音频是不是 APE 编码的呢?


首先,我们可以通过音频文件后缀,如果是 *.ape ,则是 APE 音频文件。但是,这种判断方式并不严谨。接下来,我们看第二种方法。


通过分析 APE 音频编码的源文件信息,我们发现 APE 音频文件最开始的四个字符分别是“M”、“A”、“C”、“ ”(空格),我们可以把这个特点作为判断标识。


源文件信息:


/*****************************************************************************************Defines*****************************************************************************************/#define COMPRESSION_LEVEL_FAST          1000#define COMPRESSION_LEVEL_NORMAL        2000#define COMPRESSION_LEVEL_HIGH          3000#define COMPRESSION_LEVEL_EXTRA_HIGH    4000#define COMPRESSION_LEVEL_INSANE        5000 #define MAC_FORMAT_FLAG_8_BIT                 1    // is 8-bit [OBSOLETE]#define MAC_FORMAT_FLAG_CRC                   2    // uses the new CRC32 error detection [OBSOLETE]#define MAC_FORMAT_FLAG_HAS_PEAK_LEVEL        4    // uint32 nPeakLevel after the header [OBSOLETE]#define MAC_FORMAT_FLAG_24_BIT                8    // is 24-bit [OBSOLETE]#define MAC_FORMAT_FLAG_HAS_SEEK_ELEMENTS    16    // has the number of seek elements after the peak level#define MAC_FORMAT_FLAG_CREATE_WAV_HEADER    32    // create the wave header on decompression (not stored) #define CREATE_WAV_HEADER_ON_DECOMPRESSION    -1#define MAX_AUDIO_BYTES_UNKNOWN -1 typedef void (__stdcall * APE_PROGRESS_CALLBACK) (int); /*****************************************************************************************WAV header structure*****************************************************************************************/struct WAVE_HEADER{    // RIFF header    char cRIFFHeader[4];    uint32 nRIFFBytes;     // data type    char cDataTypeID[4];     // wave format    char cFormatHeader[4];    uint32 nFormatBytes;     uint16 nFormatTag;    uint16 nChannels;    uint32 nSamplesPerSec;    uint32 nAvgBytesPerSec;    uint16 nBlockAlign;    uint16 nBitsPerSample;        // data chunk header    char cDataHeader[4];    uint32 nDataBytes;}; /*****************************************************************************************APE_DESCRIPTOR structure (file header that describes lengths, offsets, etc.)*****************************************************************************************/struct APE_DESCRIPTOR{    char    cID[4];                             // should equal 'MAC ',文件开头的四个字符可以作为判断依据    uint16  nVersion;                           // version number * 1000 (3.81 = 3810)     uint32  nDescriptorBytes;                   // the number of descriptor bytes (allows later expansion of this header)    uint32  nHeaderBytes;                       // the number of header APE_HEADER bytes    uint32  nSeekTableBytes;                    // the number of bytes of the seek table    uint32  nHeaderDataBytes;                   // the number of header data bytes (from original file)    uint32  nAPEFrameDataBytes;                 // the number of bytes of APE frame data    uint32  nAPEFrameDataBytesHigh;             // the high order number of APE frame data bytes    uint32  nTerminatingDataBytes;              // the terminating data of the file (not including tag data)     uint8   cFileMD5[16];                       // the MD5 hash of the file (see notes for usage... it's a littly tricky)};
复制代码


使用 UE 打开 APE 音频 demo 文件,显示的十六进制信息如下:



可以发现,文件开头的四个字符分别是 4D(M)、41(A)、43(C)、20(空格),这一点和上文的源码是对的上。


对应 demo 的媒体信息如下:



一段 4 分钟左右的音频,大小将近 25MB,可见 APE 格式在压缩比例上并不高,也正因为如此才能保证无损编码,实现 100%的还原效果。

实战场景


  1. 点播系统支持 APE 格式音频上传


ffmpeg 支持 APE 编码格式的解码,所以基于 ffmpeg 的点播转码方案完全能够支持 APE 纯音频文件的上传及统一归类为 AAC 格式进行管理,便于这个终端播放器进行播放。


  1. 之前自己尝试将别的格式的音频转码成 APE,是行不通的。


运行命令:


ffmpeg -i Girl.wav output.ape


报错截图:



运行结果:


localhost:bin lz$ ./ffmpeg -i Girl.wav output.ape
ffmpeg version git-2020-06-28-4cfcfb3 Copyright (c) 2000-2020 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.8)
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --enable-appkit --enable-avfoundation --enable-coreimage --enable-audiotoolbox
libavutil 56. 55.100 / 56. 55.100
libavcodec 58. 93.100 / 58. 93.100
libavformat 58. 47.100 / 58. 47.100
libavdevice 58. 11.100 / 58. 11.100
libavfilter 7. 86.100 / 7. 86.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
[wav @ 0x7ff272004000] Discarding ID3 tags because more suitable tags were found.
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, wav, from 'Girl.wav':
Metadata:
album : Black Cherry
artist : Koda Kumi
genre : JPop
comment :
title : Cherry Girl
track : 11
date : 2006
Duration: 00:03:55.28, bitrate: 1411 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
[NULL @ 0x7ff272021200] Unable to find a suitable output format for 'output.ape'
output.ape: Invalid argument
复制代码


原因:ffmpeg 支持 APE 音频格式解码,但是不支持编码成相应的音频格式。如果想要支持, 则需要编译对应的音频编码库,就像编译 fdk_aac 库一样。

参考文献

https://github.com/fernandotcl/monkeys-audio/blob/master/src/MACLib/MACLib.h


作者简介:大家好,我是 Data-Mining(liuzhen007),先后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解。

发布于: 2 小时前阅读数: 9
用户头像

liuzhen007

关注

敲代码,搞开发。 2021.05.01 加入

本人深耕音视频技术,走全栈路线,前后端通吃,兼顾各端与流媒体服务器。 博客主页地址:https://liuzhen.blog.csdn.net 微信公众号:玩转音视频 欢迎交流学习!

评论

发布
暂无评论
音频知识点(1)- 音频格式之 Monkeys Audio(APE)