Linux / FreeBSDでMP3の長さを取得する


27

さまざまな長さのmp3ファイルがたくさんあります。長さを50〜60%に減らしたい。1分から30秒までと言います。ffmpegを使用すれば簡単です。しかし、ffmpegを使用して処理のベースとして元の長さを決定する方法がわかりません。

誰もがアイデアを持っていますか?

回答:


31

ffmpegでは、スクリプトで使用できる変数として長さを取得する方法がわかりません。しかし、mp3infoは行います。

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

はい、ffmpegで長さ情報を取得する方法はありません。私はすでにそこに述べた、私は長さを取得した後にのみffmpegを使用しています。とにかく、頭を上げてくれてありがとう。
ariefbayu

4
これは整数として長さのみを提供することに注意してください。そのため、一部のユースケースでは十分に正確ではない場合があります。
ロス

平均または可変ビットレートMP3でも機能するため、ベストアンサー!
KrisWebDev

1
追加\nして新しい行を印刷します。> mp3info -p "%S\n" sample.mp3 //合計時間(秒
-nexayq

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)}'時間部分のみ
クレイグタタリン

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、すべてのファイルのオーディオの合計長さを秒単位で印刷します。おそらくもっと効率的に行うことができますが、一度だけ書いたので、私のニーズには十分でした。(2番目のawk呼び出しは小数を取り除くため、結果は100%正確ではありませんが、再び、私のニーズには十分です。)
CVn

ffmpegの-analyzedurationフラグに注意してください。基本的に、レポートする数値は、CPUを節約するための特定のポイント以降の推定値です。
mlissner 14

ffmpegは、平均ビットレートMP3を使用して、この警告とともに不適切な期間を報告しますEstimating duration from bitrate, this may be inaccurate。この答えは、Constant Bitrate MP3でのみ有効だと思います。
KrisWebDev

9

興味深いことに、EXIFToolアプリケーションは最後の行としてMP3期間を提供します!

$ exiftool somefile.mp3
ExifToolバージョン番号:7.98
ファイル名:somefile.mp3
ディレクトリ:。
ファイルサイズ:49 MB
ファイル変更日時:2009:09:10 11:04:54 + 05:30
ファイルの種類:MP3
MIMEタイプ:オーディオ/ mpeg
MPEGオーディオバージョン:2.5
オーディオ層:3
オーディオビットレート:64000
サンプルレート:8000
チャンネルモード:シングルチャンネル
MSステレオ:オフ
強度ステレオ:オフ
著作権フラグ:False
オリジナルメディア:True
重点:なし
ID3サイズ:26
ジャンル:ブルース
期間:1:47:46(約)

3

ffmpegand のみを使用して期間を取得する別の方法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は、インターフェースとして設計されていない出力を解析しているため、ややもろいように思います。とはいえ、おそらく彼らは関係なく数年間働き続けるでしょう。

ffmpegffprobeオーディオファイル(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

人々に感謝します!私はあなたのアイデアと知識を使用します読んでくれてありがとう、良い一日を!;)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.