2012-01-19 32 views
23

Tôi cần kiểm tra thời lượng của một nhóm tệp âm thanh. Có cách nào đơn giản để thực hiện điều này trên dòng lệnh unix không?kiểm tra thời lượng tệp âm thanh trên dòng lệnh

> duration * 

Tôi có ứng dụng SoX tuyệt vời có tùy chọn được gọi là số liệu thống kê tạo tập hợp thông tin âm thanh bao gồm cả thời lượng. Tôi đang tìm cách để có được thời gian duy nhất. Tôi linh hoạt ở định dạng đầu ra, có thể là bất kỳ độ dài mẫu nào, hh: mm: ss hoặc giây. Thứ hai sẽ là sở thích của tôi.

Trả lời

15
mp3info -p "%m:%s\n" filename 

cung cấp cho bạn độ dài của tệp được chỉ định.

+1

nên quấn rằng trong một vòng lặp for và bạn đã cài đặt xong, 'for file in * .mp3; làm mp3info -p "% m:% s \ n" $ tệp; done'. Chúc mọi người may mắn. – shellter

+1

mp3info -p "% f% m:% s \ n" * .mp3 cũng hoạt động - sẽ in tên tệp và thời lượng –

25
soxi -D filename 
soxi -D * 

Siêu truy vấn siêu dữ liệu của tệp âm thanh; D là tùy chọn thời lượng. Nó hỗ trợ globbing. Anh trai của Soxi sox thực hiện xử lý âm thanh dòng lệnh.

+0

soxi là những gì tôi sử dụng, nhưng tiếc là nó thiếu hỗ trợ m4a – dan3

+0

Đối với ASF/WMV quá . – galva

7

mediainfo sẽ trả về cho bạn phần nghìn giây của tệp âm thanh. Giả sử thư mục hiện hành chỉ có các file âm thanh, sau

mediainfo --Inform="Audio;%Duration%" "Miley Cyrus - Wrecking Ball.mp3" 

Để tính thời gian của tất cả các âm thanh trong thư mục địa phương, this gist sẽ giúp:

shopt -s nullglob 
let playlist_duration_ms=0 
for song_file in *.{mp3,ogg,m4a,flac,wav}; do 
    playlist_duration_ms=$(expr $playlist_duration_ms + $(mediainfo --Inform="Audio;%Duration%" "$song_file")) 
done 
shopt -u nullglob 

let playlist_duration_secs=$(expr $playlist_duration_ms/1000) 
let playlist_duration_mins=$(expr $playlist_duration_ms/60000) 
let playlist_duration_remaining_secs=$(expr $playlist_duration_secs - $(expr $playlist_duration_mins \* 60)) 

echo $playlist_duration_mins minutes, $playlist_duration_remaining_secs seconds 
+0

Công cụ này rất tuyệt, cũng hoạt động với các tệp ogg và có sẵn trong kho lưu trữ debian – quantumbyte

+0

Tôi nghĩ câu trả lời này yêu cầu ít tài nguyên nhất từ ​​máy chạy nó so với các câu trả lời khác. –

+0

Chỉ in một dòng trống cho tôi. – JellicleCat

5

trên OSX

In độ dài của mỗi tệp âm thanh trong thư mục hiện tại:

afinfo * | awk '/estimated duration/ { print $3 }' 
.210

Bao gồm filepath:

afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }' 
1

MediaInfo thể làm điều này, nhưng MediaInfo là một trong những công cụ hữu ích đó là rất nặng tài liệu mà bạn gần như cần phải biết làm thế nào để sử dụng nó để tìm hiểu làm thế nào để sử dụng nó (xảy ra rất nhiều trong thế giới Linux).

Sau nhiều giờ thử nghiệm và đọc cao và thấp, cuối cùng tôi đã tạo ra một danh sách các tên tệp được phân cách bằng dấu phẩy được phân tách bằng dấu phẩy và thời lượng của chúng theo mili giây.

cd vào thư mục khởi động và thực hiện lệnh sau:

find "$(pwd)" -type f -print0 | xargs -0 -I {} mediainfo --Inform="General;%CompleteName%,%Duration%" {} > list.txt 

Kết quả sẽ được sản xuất để list.txt.

4

Ngoài của answer, cdosborn để tính toán độ dài của tất cả các .mp3 file đệ quy trong thư mục con của thư mục hiện tại và hiển thị tổng số kết quả tổng hợp trong days:hours:minutes:seconds định dạng:

Trong zsh:

afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' 

Trong bash hoặc sh:

find . -name "*.mp3" -exec afinfo {} \; | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' 

Kết quả như sau (7 ngày, 5 giờ, 6 phút, 58 giây onds):

$ afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' 
7:05:06:58 
$ 
1

soxi câu trả lời khác bao gồm tên tệp và thời lượng theo giờ, phút và giây.

$for f in *amr; do printf "$f "; soxi -d $f; done 

DGT20161216.amr 00:22:04.62 
DGT20170108.amr 00:28:22.80 
DGT20170117.amr 00:20:05.18 
0
sox --info -D file    --> duration in seconds 
sox --info -d file    --> duration in HH:mm:ss.ss 
sox --info fils    --> metadata 
0

Một giải pháp dựa trên mplayer từ commandlinefu bởi syssyphus làm việc với cả hai tập tin âm thanh và video:

sudo apt-get install mplayer 
find -type f -name "*.mp3" -print0 | xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1 

Lấy tổng chiều dài của tất cả các video/âm thanh trong thư mục hiện tại (và bên dưới) trong H: m: s

Thay đổi *.mp3 thành bất kỳ thứ gì bạn muốn khớp (ví dụ: *.avi, *.wav), bạn có thể xóa hoàn toàn nếu bạn muốn kiểm tra tất cả các tệp.

Ví dụ về đầu ra: 00:00:37

Các vấn đề liên quan