有声读物

出自 ArchWiki

此文章或章节需要语言、wiki 语法或风格改进。请参考 Help:Style

原因: 大部分命令行缺少提示符,请查看 Help:Style#命令行文本。(在 Talk:Audiobook 中讨论)

有声读物媒体可以是音频 CD 或下载文件,存在多种格式。对于某些硬件媒体播放器,特定的格式是必要的。本文档介绍了如何创建或转换各种格式类型的有声读物。

iPod 兼容格式

本节的目的是详细介绍使用 Linux 原生工具从数字媒体创建 iPod 友好型有声读物的过程。

为 iPod 设计的有声读物在很大程度上与 MPEG-4 音频文件相同 — 它包含音频流和关于该流的信息(元数据)。 两个区别是:一是它被包装在一个特别命名的 MPEG-4 容器 (.m4b) 中;二是它添加了章节索引到元数据中。章节索引使用 Quicktime 标准。

基本过程如下:音频源被解码/解压缩(通常最好有一个解码后的纯音频文件,因为这将简化稍后的文件连接/分割,并防止元数据标签的混合);之后,音频文件被编码为 AAC 格式 — 使用 MPEG-4 容器;最后,添加章节索引和音频信息标签。

有多种工具可用于帮助创建有声读物文件。

工具

  • faac — 开源 AAC 编码器
  • neroaacenc-binAUR — 专有 AAC 编码器
  • gpac — 用于操作 MPEG-4 媒体的多媒体框架
  • lame — MP3 编码器和解码器

提取或解码

如果音频源文件是光盘媒体,则需要提取;如果是编码文件,则需要解码。

如果有声读物是光盘媒体,则有多种 数字音频提取实用程序 可用。 从 CD 提取音频到 WAV 格式文件的常用方法是

cdparanoia -B

如果有声读物是音频文件,则可以使用各种程序对其进行解码。 例如,对于 MP3

lame --decode part-01.mp3

(如果不需要分割连接,文件可以直接编码为带有 MPEG-4 容器的 AAC。)

连接或分割

有声读物部分通常以大约一小时十分钟的片段保存(通常是音频 CD 的时间长度)。 它们可以根据需要连接或分割。

连接 WAV 文件

sndfile-concat track-01.wav track-02.wav… disc-1.wav  # or more easily
sndfile-concat track*.wav disc-1.wav

连接 MPEG-4 兼容音频 文件(AAC、AVI、MP3…)

MP4Box -cat track-01.aac -cat track-02.aac… disc-1.aac

分割 wav 文件 (wavsplitAUR 可以做到这一点(未经测试))。

MP3 文件分割成 10 分钟间隔

mp3splt -f -t 10.0 part-01.mp3 -o @n

按章节/音轨分割 MP3(此方法扫描静音并假定它们是章节/音轨标记,并在这些标记上分割它们 — 这些设置是通用的,可能需要进一步调整才能工作)

mp3splt -f -s -p -min=3 part-01.mp3

分割 MPEG 4 兼容音频 文件(可能需要元数据修复)成 10 分钟间隔。

MP4Box -split 600 target.mp4

编码

存在多个可以编码为 AAC 的程序。

要使用开源编码器 FAAC 进行编码

faac -q 80 -o part-01.aac part-01.wav
faac -q 80 -o part-01.m4b part-01.wav -w  # with a MPEG-4 container(wrapper)

要使用专有编码器 Nero 进行编码

neroAacEnc -q 0.7 -of part-01.aac -if part-01.wav
注意: 当从有声读物 CD 编码时,建议 FAAC 量化器质量设置为 55 (~64kbps)。 此设置适用于已经是编码文件的音频源。 FAAC 设置为 80 应该可以合理地兼顾音质,同时保持文件大小接近原始文件。 每当从一种有损格式转换为另一种格式时,总会丢失一些信息。
警告: 虽然 ffmpeg 可以一步将 MP3 转换为 AAC 编码 (ffmpeg -i track1.mp3 -acodec aac -strict -2 track1.aac),但对 AAC 的支持是实验性的。

章节索引合并

要将章节索引合并到音频文件中,必须确定使用哪种类型的索引:一种是周期性间隔,具有周期性的章节时间;另一种是特定间隔,具有明确的章节时间和名称。

向音频文件添加 MPEG-4 容器

MP4Box -add disc-1.aac disc-1.m4b

周期性间隔

要合并章节索引,每 10 分钟一个章节

mp4chaps --every 600 disc-1.m4b

特定间隔

该方法需要将章节索引编写为文本文件,并将其合并到音频文件中。

注意: 当尝试使用 --import 选项将章节索引与音频文件合并时,mp4chaps 会抱怨没有看到视频流(可能应该提交错误报告)。 另一种方法是使用 MP4Box。 虽然 MP4Box 通常用于视频文件,但它具有添加章节的功能,而不会引入视频流。 因此,生成的媒体将能够像预期一样在 iPod 和 iTunes 上播放。

章节索引需要先编写为文本文件,然后才能合并到音频文件中。 章节索引有两个标准:一是 Quicktime 标准;二是 Nero 标准。 都可以先合并。

Quicktime 标准如下所示(也可以添加千分之一秒 .000

00:00:00 Track 01
00:08:40 Track 02
...

Nero 标准如下所示

CHAPTER1=00:00:00
CHAPTER1NAME=Track 01
CHAPTER2=00:08:40
CHAPTER2NAME=Track 02
...

要合并章节索引文件

MP4Box -chap disc-1.chapters.txt disc-1.m4b

要一步合并章节索引文件以及音频文件和容器

MP4Box -chap disc-1.chapters.txt -add disc-1.aac disc-1.m4b

章节索引需要转换为 Quicktime 标准(虽然 MP4Box 在导入时会识别两种章节索引标准,但它导入时使用 Nero 标准)。 使用以下命令转换为 Quicktime 标准

mp4chaps --convert --chapter-qt disc-1.m4b

现在可以测试章节索引,例如使用 VLC。

标签

可以使用许多 标签程序。 由 libmp4v2 提供的基本命令行程序具有多种功能

$ mp4tags -album "An Good Audiobook" -artist "John Doe" -disk 2 -disks 10 -genre Nonfiction -albumartist "Ms. Foo Bar" -song "Disc 2" -year 2004 disc1.m4b

添加封面

$ mp4art --add a-good-audiobook.jpg disc-1.m4b

优化容器

$ mp4file --optimize *.m4b

批量处理示例

可以使用循环处理多个音频文件

for m in *.mp3; do
  lame --decode "$m"
  faac -q 80 -o "${m%.*}".aac "$m"
done

写入顺序光盘编号的标签

for b in *.m4b; do
  [ "$n" ] && n=$((10#$n + 1))
  [ -z "$n" ] && n=1
  mp4tags -album "An Good Audiobook"… -disk $(printf "%02u" $n)… "$b"
done

Audible 格式

转换 Audible 图书格式可能是一个费力的过程 — 文章

一个更简单的方法是使用此脚本从下载的 Audible 有声读物中检索您的激活字节 — 链接

然后您可以使用 mpv 收听文件

$ mpv --demuxer-lavf-o=activation_bytes=<your activation bytes> <filename>.aax

或者您可以使用 ffmpeg (文档) 将文件写入未加密的 .mp4

$ ffmpeg -activation_bytes <your activation bytes> -i <filename>.aax -vn -c:a copy <output>.mp4

生成的文件将具有完整的章节标题。

参见

  • Wikipedia:.m4b
  • ripitAUR — 彻底的 DAE,具有使用 --book 选项创建章节索引的能力。