基于Xuggle架构的m4b文件拆分
Xuggle是利用java来包装ffmpeg的一个框架,在程序中可以很方便的通过xuggle的对象和方法来处理音视频文件,而不用直接使用ffmpeg命令行。
M4B格式是一种可以在iPod/iPhone及iPad上播放的称为“有声读物”的音频文件格式,自持书签。
本课题是基于书签信息(chapter)来对m4b文件进行格式转换和切割,最后获得以各chapter的名字来命名的MP3音频文件。
1,书签信息的获得
毫无疑问,首先必须取得书签的相关信息。
Xuggle对m4b文件划分为视频流层(ICodec.Type.CODEC_TYPE_VIDEO)、音频流层(ICodec.Type.CODEC_TYPE_AUDIO)等不同的信息层,而书签信息理论上应该是在子标题流层(ICodec.Type.CODEC_TYPE_SUBTITLE),可以直接通过读取该信息层的关键帧来获得各个chapter的信息。
但是在实际试验中发现,通过chapter mster添加的chapter信息并没有被读出子标题流层,而是作为未知数据层(ICodec.Type.CODEC_TYPE_UNKNOWN)被读入的。因此只能通过读取其入口来获得部分信息(包括时间戳、长度、位置):
List<IIndexEntry> inEnList = stream.getIndexEntries();
2,书签名字的获得
由于未知数据层无法读取数据(没有匹配的解码器),因此,无法直接获取书签名字,于是只能通过java的文件读入来取这个名字,通过上面提到的长度和位置信息,可以很方便的通过RandomAccessFile来直接读取每个书签的元数据,进而获得书签的名字。
3,音频流层信息的获取和分割
首先,通过逐个读取数据信息包(IPacket),通过判断其所处信息层来确定是否为所需的音频数据,如是音频数据,则进一步获取其格式信息(包括比特率、解码器、时间戳等,用于后续的音频文件生成)并写出。
其次,根据书签信息中的书签时间戳来作为新生成的mp3文件的起止点。
综上,生成mp3文件并以各chapter的名字命名,实现功能。