目录
前言
正文
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%的还原效果。
实战场景
点播系统支持 APE 格式音频上传
ffmpeg 支持 APE 编码格式的解码,所以基于 ffmpeg 的点播转码方案完全能够支持 APE 纯音频文件的上传及统一归类为 AAC 格式进行管理,便于这个终端播放器进行播放。
之前自己尝试将别的格式的音频转码成 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 有非常深入的了解。
评论