Nhận độ dài MP3 trong Linux / FreeBSD


27

Tôi có một loạt các tập tin mp3 với độ dài khác nhau. Tôi muốn cắt nó xuống chiều dài 50% -60%. Nói, từ 1 phút xuống còn 30 giây. Nó nên tầm thường khi sử dụng ffmpeg. Nhưng, tôi không biết cách xác định độ dài ban đầu của nó làm cơ sở để xử lý bằng ffmpeg.

Bất cứ ai có một ý tưởng?

Câu trả lời:


31

Với ffmpeg, không có cách nào tôi biết để lấy độ dài làm biến bạn có thể sử dụng trên tập lệnh. Nhưng mp3info thì có.

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

vâng, không có cách nào để có được thông tin độ dài trong ffmpeg. Tôi đã nói ở đó, tôi chỉ sử dụng ffmpeg sau khi tôi nhận được độ dài. Dù sao, cảm ơn cho những người đứng đầu UP.
ariefbayu

4
Đáng lưu ý rằng điều này chỉ cung cấp độ dài dưới dạng Số nguyên. Vì vậy, có thể không đủ chính xác cho một số trường hợp sử dụng.
Ross

Câu trả lời hay nhất vì nó hoạt động ngay cả với MP3 Bitrate trung bình hoặc biến!
KrisWebDev

1
Thêm vào \nđể in dòng mới cũng có. > mp3info -p "%S\n" sample.mp3 // tổng thời gian tính bằng giây
nexayq

22

ffmpegsẽ in mọi thứ nó biết về tệp nếu bạn không cung cấp cho nó bất kỳ đối số nào khác. Sử dụng grepđể loại bỏ mọi thứ trừ "Thời lượng":

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

Bạn cũng có thể sử dụng mplayer. Grep cho dòng "ID_LENGTH =":

$ 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 '/ Thời lượng / {chất nền in ($ 2,0, chiều dài ($ 2) -1)}' Chỉ cho phần thời gian
Craig Tataryn

Để tính tổng độ dài của một tập hợp các tệp MP3, bạn có thể sử dụng một cái gì đó như 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để in tổng chiều dài của âm thanh trong tất cả các tệp, tính bằng giây. Nó có thể được thực hiện hiệu quả hơn, nhưng vì tôi đã viết nó một lần, nó đủ tốt cho nhu cầu của tôi. (Các awk gọi thứ hai dải tắt thập phân, vì vậy kết quả là chính xác không phải là 100%, nhưng một lần nữa, đủ tốt cho nhu cầu của tôi.)
một CVN

Cẩn thận với cờ phân tích của ffmpeg. Về cơ bản, những con số mà nó báo cáo là ước tính sau một thời điểm nhất định để tiết kiệm CPU.
mlissner

Sử dụng MP3 Bitrate trung bình, ffmpeg báo cáo thời lượng không chính xác cùng với cảnh báo này Estimating duration from bitrate, this may be inaccurate. Tôi nghĩ rằng câu trả lời này chỉ hợp lệ với Constant Bitrate MP3.
KrisWebDev

9

Điều thú vị là ứng dụng EXIFTool cho thời lượng MP3 là dòng cuối cùng!

$ exiftool somefile.mp3
Số phiên bản ExifTool: 7,98
Tên tệp: somefile.mp3
Danh mục : .
Kích thước tệp: 49 MB
Ngày / Thời gian sửa đổi tệp: 2009: 09: 10 11: 04: 54 + 05: 30
Loại tệp: MP3
Loại MIME: âm thanh / mpeg
Phiên bản âm thanh MPEG: 2.5
Lớp âm thanh: 3
Tốc độ bit âm thanh: 64000
Tỷ lệ mẫu: 8000
Chế độ kênh: Kênh đơn
MS Stereo: Tắt
Âm thanh nổi cường độ: Tắt
Cờ bản quyền: Sai
Phương tiện truyền thông gốc: Đúng
Nhấn mạnh: Không có
Kích thước ID3: 26
Thể loại: Blues
Thời lượng: 1:47:46 (khoảng)

3

Chỉ là một cách khác để có được thời lượng chỉ sử dụng ffmpeggrep:

# 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

Các giải pháp sử dụng ffmpegtấn công tôi hơi mong manh, vì chúng đang phân tích cú pháp đầu ra không được thiết kế như một giao diện. Điều đó nói rằng họ có thể sẽ tiếp tục làm việc trong vài năm bất kể.

ffmpegđi kèm với một công cụ ffprobeđể có được thông tin về các tệp âm thanh (rất nhiều định dạng, bao gồm cả mp3) và có thể tạo ra đầu ra có thể đọc được bằng máy. Lệnh sau được thời lượng bài hát.

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

2
Bạn chỉ có thể làmffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Gyan

1

Cá nhân tôi sử dụng Mplayer để trích xuất thông tin, chủ yếu là vì tôi đã cài đặt nó và không cần phải cài đặt phần mềm mới một cách không cần thiết. Ưu điểm của điều này là nó không giới hạn ở các tệp mp3 nói riêng và nên hoạt động với mọi tệp phương tiện mà Mplayer có thể xử lý. Một lớp lót sau đây sẽ trả về thời lượng theo dõi trong vài giây.

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

1

Bạn có thể sử dụng ffmpeg để lấy thời lượng của tệp. Chỉ dùng:

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

0

Tôi gặp vấn đề tương tự và thấy lệnh mplayer (goldPseudo) hoạt động tốt, nhưng sau đó tôi phát hiện ra rằng nếu bạn mở một album trong RhybeatBox, bạn sẽ thấy dòng trạng thái của nó đưa ra số lượng bản nhạc, tổng thời gian phát và kích thước đĩa.


-1

Đây là đơn giản của tôi bằng cách sử dụng giới thiệu ở trên.

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

Tôi gửi giá trị đó đến biến 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

Cảm ơn mọi người ở trên! Tôi sử dụng ý tưởng và kiến ​​thức của bạn Cảm ơn bạn đã đọc, Chúc một ngày tốt lành! ;)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.