Linux / FreeBSD'de MP3 Uzunluğunu Alın


27

Çeşitli uzunluklarda bir sürü mp3 dosyam var. % 50 -% 60 uzunluğa kadar kesmek istiyorum. 1 dakikadan 30 saniyeye kadar diyor. Ffmpeg kullanarak önemsiz olması gerekir. Ancak, ffmpeg kullanarak işleme için orijinal uzunluğunu nasıl belirleyeceğimi bilmiyorum.

Bir fikri olan var mı?

Yanıtlar:


31

Ffmpeg ile uzunluğu bir komut dosyasında kullanabileceğiniz bir değişken olarak bilmenin bir yolu yok. Ama mp3info yapar.

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

evet, ffmpeg'de uzunluk bilgisi elde etmenin yolu yok. Daha önce de belirtmiştim, ancak uzunluğu aldıktan sonra ffmpeg kullanıyorum. Neyse, başkanlar için teşekkürler.
ariefbayu

4
Bunun sadece bir Tamsayı olarak uzunluk sağladığını belirtmek gerekir. Bu yüzden bazı kullanım durumları için yeterince doğru olmayabilir.
Ross

Ortalama veya Değişken Bit Hızı MP3 ile bile çalıştığından en iyi cevap!
KrisWebDev

1
\nAyrıca yeni satır yazdırmak için ekleyin . > mp3info -p "%S\n" sample.mp3 // saniye cinsinden toplam süre
nexayq

22

ffmpegBaşka bir argüman vermezseniz, dosya hakkında bildiği her şeyi yazdıracaktır. grep"Süre" dışında her şeyi çıkartmak için kullanın :

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

Ayrıca kullanabilirsiniz mplayer. "ID_LENGTH =" satırı için 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 '/ Süre / {substr (2,0 ABD doları, uzunluk (2 ABD doları) -1)}' Tam zaman bölümü için
Craig Tataryn

Bir dizi MP3 dosyasının uzunluğunu toplamak için 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, sesin toplam uzunluğunu tüm dosyalarda, saniyeler içinde yazdırmak gibi bir şey kullanabilirsiniz . Muhtemelen daha verimli bir şekilde yapılabilir, ancak bir kereye mahsus olarak yazdığımdan beri ihtiyaçlarım için yeterince iyiydi. (İkinci awk çağrısı onlukları çıkarır, bu nedenle sonuç% 100 doğru değildir, ancak yine de ihtiyaçlarım için yeterince iyi.)
CVn

Ffmpeg -analyzeduration bayrağına dikkat edin. Temel olarak, rapor ettiği sayılar CPU'yu kurtarmak için belirli bir noktadan sonra tahmin edilir.
mlissner

Bir Ortalama Bit Hızı MP3 kullanarak, ffmpeg bu uyarıyla birlikte yanlış bir süre bildiriyor Estimating duration from bitrate, this may be inaccurate. Bence bu cevap sadece Constant Bitrate MP3 ile geçerli .
KrisWebDev

9

İlginç bir şekilde EXIFTool uygulaması, son satır olarak MP3 süresini veriyor!

$ exiftool somefile.mp3
ExifTool Sürüm Numarası: 7.98
Dosya Adı: somefile.mp3
Dizin:.
Dosya Boyutu: 49 MB
Dosya Değiştirme Tarihi / Saati: 2009: 09: 10 11: 04: 54 + 05: 30
Dosya Türü: MP3
MIME Türü: ses / mpeg
MPEG Ses Sürümü: 2.5
Ses Katmanı: 3
Ses Bit Hızı: 64000
Örnekleme Hızı: 8000
Kanal Modu: Tek Kanal
MS Stereo: Kapalı
Yoğunluk Stereo: Kapalı
Telif Hakkı Bayrağı: Yanlış
Orijinal Medya: Doğru
Vurgu: Yok
ID3 Boyutu: 26
Tür: Blues
Süre: 1:47:46 (yaklaşık)

3

Sadece ffmpegve kullanarak süresi almak için başka bir yol 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

ffmpegArayüzü kullanan çözümler bana oldukça kırılgan geliyor, çünkü bunlar bir arayüz olarak tasarlanmayan çıktıları ayırıyorlar. Bu, muhtemelen, ne olursa olsun birkaç yıl çalışmaya devam edeceklerini söyledi.

ffmpegffprobeSes dosyaları (mp3 dahil birçok format) hakkında bilgi almak için bir araçla birlikte gelir ve makinede okunabilir çıktılar üretebilir. Aşağıdaki komut şarkı süresini alır.

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

2
Siz sadece yapabilirsinizffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Gyan

1

Bilgileri kişisel olarak çıkarmak için şahsen Mplayer kullanıyorum , çünkü daha önceden kurdum ve gereksiz yere yeni bir yazılım yüklemek için uğraşamıyorum. Bunun avantajı, özellikle mp3 dosyaları ile sınırlı olmaması ve Mplayer'ın işleyebileceği herhangi bir medya dosyasıyla çalışması gerektiğidir. Aşağıdaki tek astar iz uzunluğunu saniyeler içinde geri getirecektir.

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

1

Dosya süresini almak için ffmpeg kullanabilirsiniz. Sadece kullan:

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

0

Aynı problemi yaşadım ve mplayer komutunun (goldPseudo) iyi çalıştığını gördüm, ancak daha sonra RhythmBox'ta bir albüm açarsanız durum satırının parça sayısını, toplam çalma süresini ve disk boyutunu verdiğini görmüştüm.


-1

Yukarıda basit kullanarak benim basit.

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

Bu değeri mp3_full_length değişkenine gönderirim

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

İnsanların üstünde teşekkür ederim! Fikir ve bilgilerinizi kullanıyorum Okuduğunuz için teşekkür ederim, İyi günler! ;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.