111

原始问题

我希望能够从现有的 MP3 文件生成一个新的(完全有效的)MP3 文件以用作预览——先试后买风格。新文件应仅包含曲目的前n秒。

现在,我知道在传递文件时我可以在n秒内“截断流”(根据比特率和标头大小计算),但这有点脏,而且是 VBR 轨道上的真正 PITA。我希望能够生成正确的 MP3 文件。

有人有什么想法吗?

答案

两者都是很好的解决方案mp3splitffmpeg我选择了 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

正如 Tim Farley 建议的那样,您可以复制原始轨道设置,而不是设置 -ab 和 -ar:

  • -acodec copy
4

8 回答 8

151

我也推荐 ffmpeg,但 John Boker 建议的命令行有一个意想不到的副作用:它将文件重新编码为默认比特率(在我这里的版本中至少是 64 kb/s)。这可能会让您的客户对您的声音文件的质量产生错误的印象,而且这也需要更长的时间。

这是一个命令行,无需转码即可切片为 30 秒:

ffmpeg -t 30 -i inputfile.mp3 -acodec copy outputfile.mp3

-acodec 开关告诉 ffmpeg 使用不转码的特殊“复制”编解码器。它快如闪电。

注意:该命令是根据 Oben Sonne 的评论更新的

于 2008-09-04T15:42:02.153 回答
62

如果您希望删除前 30 秒(并保留剩余部分),请使用以下命令:

ffmpeg -ss 30 -i inputfile.mp3 -acodec copy outputfile.mp3
于 2010-05-27T23:30:11.503 回答
18

尝试:

ffmpeg -t 30 -i inputfile.mp3 outputfile.mp3
于 2008-09-04T14:45:30.930 回答
13

该命令也可以完美运行。我将音乐文件从 20 秒缩短到 40 秒。

-y :强制输出文件覆盖。

ffmpeg -i test.mp3 -ss 00:00:20 -to 00:00:40 -c copy -y temp.mp3
于 2017-06-14T06:03:07.420 回答
11

你可以使用 mp3cut:

cutmp3 -i foo.mp3 -O 30s.mp3 -a 0:00.0 -b 0:30.0

它在 ubuntu 存储库中,所以只需:sudo apt-get install cutmp3.

于 2011-09-19T00:15:13.827 回答
6

您可能想尝试Mp3Splt

我之前在一个简单地包装了 mp3splt.exe win32 进程的 C# 服务中使用过它。我假设在你的 Linux/PHP 场景中可以做类似的事情。

于 2008-09-04T14:45:52.163 回答
1

我在做同样的事情时遇到了错误

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
于 2016-12-02T02:41:06.083 回答
0

我的包medipack是一个非常简单的命令行应用程序,作为ffmpeg.

您可以使用以下命令来修剪视频:

medipack trim input.mp3 -s 00:00 -e 00:30 -o output.mp3
medipack trim input.mp3 -s 00:00 -t 00:30 -o output.mp3

您可以查看 trim 子命令的选项:

srb@srb-pc:$ medipack trim -h
usage: medipack trim [-h] [-s START] [-e END | -t TIME] [-o OUTPUT] [inp]

positional arguments:
  inp                   input video file ex: input.mp4

optional arguments:
  -h, --help            show this help message and exit
  -s START, --start START
                        start time for cuting in format hh:mm:ss or mm:ss
  -e END, --end END     end time for cuting in format hh:mm:ss or mm:ss
  -t TIME, --time TIME  clip duration in format hh:mm:ss or mm:ss
  -o OUTPUT, --output OUTPUT

您还可以使用探索其他选项medipack -h

srb@srb-pc:$ medipack --help
usage: medipack.py [-h] [-v] {trim,crop,resize,extract} ...

positional arguments:
  {trim,crop,resize,extract}

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         Display version number

你可以访问我的 repo https://github.com/srbcheema1/medipack并查看 README 中的示例。

于 2019-09-02T23:33:09.813 回答