读写STEM多流音频文件

stempeg的Python项目详细描述


stempeg=stems+ffmpeg

Build StatusLatest VersionSupported Python versions

用于读取和写入STEM文件的python包。 技术上,stems是带有多个音频流和附加metatdata的mp4文件。stempeg是用于ffmpeg的python接口,专门用于读写多流mp4音频文件。

安装

一。ffmpeg库的安装

stempeg依赖于ffmpeg(测试:4.1、4.0.2、3.4和2.8.6)来解码stems文件格式。为了 建议编码ffmpeg>;=3.2。

ffmpeg在不同操作系统中的安装。如果使用Anaconda,可以使用以下命令在windows/mac/linux上安装ffmpeg:

conda install -c conda-forge ffmpeg

任何最新版本的ffmpeg都支持解码。对于编码,建议使用默认ffmpeg生成中不包含的fraunhofer aac编码器(libfdk_aac)。请注意,conda版本当前不包含notincludefdk-aac。如果未安装libfdk_aacstempeg将使用默认的aac编解码器,这将导致音频质量稍差。

您可以手动安装支持libfdk-aac的ffmpeg,如下所示:

  • Mac:使用自制:brew install ffmpeg --with-fdk-aac
  • ubuntu linux:请参阅安装脚本here
  • 使用Docker(Mac、Windows、Linux):docker pull jrottenberg/ffmpeg

2.安装stempeg

使用pip通过pypi安装

pip install stempeg

用法

几乎没有免费提供的STEM文件。我们包括了一个来自加拿大摇滚乐队the easton ellises的小测试曲目。Creative Commons许可证CC BY-NC-SA 3.0下的乐队released them

要使用包含的stem示例,可以使用stempeg.example_stem_path()

读数杆

importstempegS,rate=stempeg.read_stems(stempeg.example_stem_path())

S是包含缩放到[-1..1]的时域信号的茎张量。形状是(stems, samples, channels)

读取单个茎ID

通过传递相应的STEM ID(从0开始),可以读取STEM文件的各个子流:

S,rate=stempeg.read_stems(stempeg.example_stem_path(),stem_id=[0,1])

阅读摘录(设置搜索位置)

若要从STEM而不是完整文件中读取摘录,可以提供以秒为单位的开始(start)和持续时间(duration)到read_stems

S,_=stempeg.read_stems(stempeg.example_stem_path(),start=1,duration=1.5)# read from second 1.0 to second 2.5

提高性能

如果反复调用read_stems,它总是执行两个系统调用,一个用于获取file info,另一个用于actual reading。若要加快此速度,可以将Info对象提供给read_stems如果流的数量、通道的数量和samplerate相同。

file_path=stempeg.example_stem_path()info=stempeg.Info(file_path)S,_=stempeg.read_stems(file_path,info=info)

书写杆

从numpy张量写入stem文件

stempeg.write_stems(S,"output.stem.mp4",rate=44100)

:warning: Warning: Muxing stems using ffmpeg might lead to non-conform stem files. Please use MP4Box, if you need a reliable result.

使用命令行工具

stempeg提供了一个方便的cli工具,可以将一个stem转换为多个wav文件。-s开关设置开始,-t开关设置持续时间。

stem2wav The Easton Ellises - Falcon 69.stem.mp4 -s 1.0 -t 2.5

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JPA:如何将持久性上下文与批量更新或删除的结果同步?   程序未激活时的java捕获击键   字符串到日期对象的java解析   LucenePDFDocument从pdfbox中消失了吗?   java解析ISO8601日期字符串到UTC时区的日期   java Android随机存取文件和文件系统缓冲区   java如何确保泛型类型的类型   mysql无法从Java中的数据库读取表中的行   spring用Java处理数百万条数据库记录   java AsyncTask正在引发InvocationTargetException   java这些集合允许null。为什么我不能添加空元素?   java无法从Android中的ftp服务器下载txt文件   Java堆栈跟踪未使用log4j2打印   java如何在Ubuntu 11.10上编译OpenJDK 7调试版本   java动态文件夹创建   在PHP和Java中使用socket   Java mxGraph中是否有可能限制单元格移动但不禁用它?   java如何找到org的路径。朱尼特?   方向更改时的java NullPointerException