题
原始问题
我希望能够从现有 MP3 文件生成新的(完全有效)MP3 文件以用作预览 - 先试后买的风格。新文件应该只包含第一个 n 轨道的秒数。
现在,我知道我可以“砍流” n 交付文件时的秒数(根据比特率和标头大小计算),但这有点脏,而且是 VBR 轨道上的真正 PITA。我希望能够生成正确的 MP3 文件。
有人有什么想法吗?
答案
两个都 mp3split
和 ffmpeg
都是很好的解决方案。我选择 ffmpeg,因为它通常安装在 Linux 服务器上,而且也 轻松用于 Windows. 。这里有一些更好的命令行参数,用于使用 ffmpeg 生成预览
-t <seconds>
在指定秒数后进行斩波-y
强制覆盖文件-ab <bitrate>
设置比特率,例如 -ab 96k-ar <rate Hz>
设置采样率,例如 -ar 22050 22.05kHz-map_meta_data <outfile>:<infile>
将轨道元数据从 infile 复制到 outfile
您可以复制原始轨道设置,而不是设置 -ab 和 -ar,如 Tim Farley 建议的那样:
-acodec copy
解决方案
我还推荐 ffmpeg,但 John Boker 建议的命令行有一个意想不到的副作用:它将文件重新编码为默认比特率(我这里的版本至少为 64 kb/s)。这可能会让您的客户对您的声音文件的质量产生错误的印象,而且还需要更长的时间。
下面的命令行将在不进行转码的情况下分割为 30 秒:
ffmpeg -t 30 -i inputfile.mp3 -acodec copy outputfile.mp3
-acodec 开关告诉 ffmpeg 使用不转码的特殊“复制”编解码器。速度快如闪电。
笔记:该命令已根据 Oben Sonne 的评论进行了更新
其他提示
如果您希望删除前 30 秒(并保留其余部分),请使用以下命令:
ffmpeg -ss 30 -i inputfile.mp3 -acodec copy outputfile.mp3
尝试:
ffmpeg -t 30 -i inputfile.mp3 outputfile.mp3
你可以使用 mp3cut:
cutmp3 -i foo.mp3 -O 30s.mp3 -a 0:00.0 -b 0:30.0
它在 ubuntu 存储库中,所以只需: sudo apt-get install cutmp3
.
这个命令也可以完美运行。我将音乐文件的时长从 20 秒缩短到 40 秒。
-y:强制覆盖输出文件。
ffmpeg -i test.mp3 -ss 00:00:20 -to 00:00:40 -c copy -y temp.mp3
你可能想尝试 MP3Splt.
我之前在 C# 服务中使用过它,该服务只是包装了 mp3splt.exe win32 进程。我认为类似的事情可以在您的 Linux/PHP 场景中完成。
我没有将它用于这个特定目的,但我敢打赌 ffmpeg 可以做到。
我在执行相同操作时遇到错误
Invalid audio stream. Exactly one MP3 audio stream is required.
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argumentStream mapping:
对我来说修复是:
ffmpeg -ss 00:02:43.00 -t 00:00:10 -i input.mp3 -codec:a libmp3lame out.mp3