在Linux / FreeBSD中获取MP3长度


27

我有一堆各种长度的mp3文件。我想把它减少到50%-60%的长度。说,从1分钟到30秒。使用ffmpeg应该是微不足道的。但是,我不知道如何确定它的原始长度作为使用ffmpeg处理的基础。

有人有想法吗?

Answers:


32

使用ffmpeg,我无法知道将长度作为可在脚本上使用的变量。但是mp3info确实如此。

mp3info -p "%S" sample.mp3   // total time in seconds

是的,没有办法在ffmpeg获取长度信息。我已经在那里说过,我只有在得到长度后才使用ffmpeg。无论如何,感谢负责人。
ariefbayu

4
值得注意的是,这只提供了整数的长度。因此对某些用例可能不够准确。
罗斯

最佳答案,因为它甚至可以使用平均或可变比特率MP3!
KrisWebDev 2016年

1
添加\n打印新行也。> mp3info -p "%S\n" sample.mp3 //总时间(秒)
nexayq 2017年

22

ffmpeg如果你没有给它任何其他参数,它将打印它所知道的关于该文件的所有内容。用于grep除去“持续时间”以外的所有内容:

$ ffmpeg -i foo.mp3 2>&1 | grep Duration
  Duration: 01:02:20.20, start: 0.000000, bitrate: 128 kb/s

你也可以用mplayer。线“ID_LENGTH =”的Grep:

$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00

3
$ ffmpeg -i foo.mp3 2>&1 | awk'/ Duration / {print substr($ 2,0,length($ 2)-1)}'仅适用于时间部分
Craig Tataryn 2010年

要总结一组MP3文件的长度,您可以使用类似的TOTLENGTH=0; for f in *.mp3; do LENGTH=$(mplayer -ao null -identify -frames 0 "$f" 2>&1 | awk -F= '/ID_LENGTH/ {print $2}' | awk -F. '{print $1}'); TOTLENGTH=$(($TOTLENGTH + $LENGTH)); done; echo $TOTLENGTH方式在几秒钟内打印所有文件中的音频总长度。它可以更有效地完成,但由于我把它写成一次性,它足以满足我的需求。(第二个awk调用剥离小数,因此结果不是100%准确,但再次,足以满足我的需要。)
一个CVn 2013年

小心ffmpeg的-analyzeduration标志。基本上,它报告的数字是在某一点之后估算以节省CPU。
mlissner 2014年

使用平均比特率MP3,ffmpeg会报告不正确的持续时间以及此警告Estimating duration from bitrate, this may be inaccurate。我认为这个答案仅适用于Constant Bitrate MP3。
KrisWebDev 2016年

9

有趣的是,EXIFTool应用程序将MP3持续时间作为最后一行!

$ exiftool somefile.mp3
ExifTool版本号:7.98
文件名:somefile.mp3
目录 : 。
文件大小:49 MB
文件修改日期/时间:2009:09:10 11:04:54 + 05:30
文件类型:MP3
MIME类型:audio / mpeg
MPEG音频版:2.5
音频层:3
音频比特率:64000
采样率:8000
频道模式:单频道
MS立体声:关闭
强度立体声:关闭
版权标志:错误
原创媒体:真的
重点:没有
ID3尺寸:26
类型:蓝调
持续时间:1:47:46(约)

3

只是使用ffmpeg和获取持续时间的另一种方法grep

# ffmpeg -i rara.mp3 2>&1 |grep -oP "[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{2}"
00:03:49.12

2

使用的解决方案ffmpeg让我略显脆弱,因为它们解析的输出并不是设计为接口。这说他们可能会继续工作几年,无论如何。

ffmpeg附带一个工具ffprobe来获取有关音频文件(许多格式,包括mp3)的信息,并可以生成机器可读输出。以下命令获取歌曲持续时间。

ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'

2
你可以这样做ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
吉安

1

我个人使用Mplayer来提取信息,主要是因为我已经安装了它,并且无需担心不必要地安装新软件。这样做的好处是它不仅限于mp3文件,而且应该与Mplayer可以处理的任何媒体文件一起使用。以下单行将以秒为单位返回轨道长度。

mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2

1

您可以使用ffmpeg来获取文件的持续时间。只需使用:

ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//

0

我遇到了同样的问题,发现mplayer命令(goldPseudo)运行良好,但我后来发现如果你在RhythmBox中打开一个专辑,你会看到它的状态行给出了曲目数,总播放时间和光盘大小。


-1

这是我上面简单的使用参考。

mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'
10:47:15

我将该值发送到变量mp3_full_length

mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
read -r mp3_full_length <<< `ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'`



# I can use this variable for my own purpose!
echo $mp3_full_length 
10:47:15

谢谢上面的人!我用你的想法和知识谢谢你的阅读,祝你有愉快的一天!;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.