Dapatkan Panjang MP3 di Linux / FreeBSD

27

Saya memiliki banyak file mp3 dengan berbagai panjang. Saya ingin memotongnya hingga 50% -60% panjangnya. Katanya, mulai 1 menit hingga 30 detik. Itu harus sepele menggunakan ffmpeg. Tapi, saya tidak tahu bagaimana menentukan panjang asli sebagai basis untuk diproses menggunakan ffmpeg.

Adakah yang punya ide?

ariefbayu
sumber

Jawaban:

31

Dengan ffmpeg tidak mungkin saya tahu untuk mendapatkan panjang sebagai variabel yang dapat Anda gunakan pada skrip. Tapi mp3info melakukannya.

mp3info -p "%S" sample.mp3   // total time in seconds
A Dwarf
sumber
ya, tidak ada cara untuk mendapatkan info panjang di ffmpeg. Saya sudah menyatakan di sana, saya menggunakan ffmpeg hanya setelah saya mendapatkan panjangnya. Bagaimanapun, terima kasih untuk kepala UP.
ariefbayu
4
Patut dicatat bahwa ini hanya menyediakan panjang sebagai Integer. Jadi mungkin tidak cukup akurat untuk beberapa kasus penggunaan.
Ross
Jawaban terbaik karena berfungsi bahkan dengan MP3 Bitrate Rata-Rata atau Variabel!
KrisWebDev
1
Tambahkan \nuntuk mencetak baris baru juga. > mp3info -p "%S\n" sample.mp3 // total waktu dalam detik
nexayq
22

ffmpegakan mencetak semua yang diketahui tentang file tersebut jika Anda tidak memberikan argumen lain. Gunakan grepuntuk menghapus semuanya kecuali "Durasi":

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

Anda juga bisa menggunakannya mplayer. Grep untuk baris "ID_LENGTH =":

$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00
quack quixote
sumber
3
$ ffmpeg -i foo.mp3 2> & 1 | awk '/ Durasi / {print substr ($ 2,0, panjang ($ 2) -1)}' Untuk waktu yang tepat
Craig Tataryn
Untuk menjumlahkan panjang satu set file MP3, Anda dapat menggunakan sesuatu seperti 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 $TOTLENGTHuntuk mencetak total panjang audio di semua file, dalam hitungan detik. Ini mungkin dapat dilakukan dengan lebih efisien, tetapi karena saya menulisnya sekali saja, itu cukup baik untuk kebutuhan saya. (Doa awk kedua menghapus desimal, jadi hasilnya tidak 100% akurat, tapi sekali lagi, cukup bagus untuk kebutuhan saya.)
a CVn
Waspadai bendera-analisis ffmpeg. Pada dasarnya, angka-angka yang dilaporkannya adalah perkiraan setelah titik tertentu untuk menghemat CPU.
mlissner
Menggunakan rata-rata Bitrate MP3, ffmpeg melaporkan durasi yang salah bersama dengan peringatan ini Estimating duration from bitrate, this may be inaccurate. Saya pikir jawaban ini hanya valid dengan Constant Bitrate MP3.
KrisWebDev
9

Menariknya, aplikasi EXIFTool memberikan durasi MP3 sebagai baris terakhir!

$ exiftool somefile.mp3
Nomor Versi ExifTool: 7.98
Nama File: somefile.mp3
Direktori : .
Ukuran File: 49 MB
Modifikasi File Tanggal / Waktu: 2009: 09: 10 11: 04: 54 + 05: 30
Jenis File: MP3
Jenis MIME: audio / mpeg
Versi Audio MPEG: 2.5
Lapisan Audio: 3
Audio Bitrate: 64000
Tingkat Sampel: 8000
Mode Saluran: Saluran Tunggal
MS Stereo: Mati
Stereo Intensitas: Mati
Bendera Hak Cipta: Salah
Media Asli: Benar
Penekanan: Tidak ada
Ukuran ID3: 26
Genre: Blues
Durasi: 1:47:46 (kurang-lebih)
nik
sumber
3

Cara lain untuk mendapatkan durasi hanya menggunakan ffmpegdan 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
FC
sumber
2

Solusi menggunakan ffmpegstrike me sedikit rapuh, karena mereka mengurai output yang tidak cukup dirancang sebagai antarmuka. Namun mereka mungkin akan terus bekerja selama beberapa tahun.

ffmpegdilengkapi dengan alat ffprobeuntuk mendapatkan informasi tentang file audio (banyak format, termasuk mp3), dan dapat menghasilkan output yang dapat dibaca mesin. Perintah berikut mendapatkan durasi lagu.

ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'
Att Righ
sumber
2
Anda bisa melakukannyaffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Gyan
1

Saya pribadi menggunakan Mplayer untuk mengekstrak informasi, sebagian besar karena saya sudah menginstalnya dan tidak perlu repot untuk menginstal perangkat lunak baru yang tidak perlu. Keuntungannya adalah tidak terbatas pada file mp3 pada khususnya, dan harus bekerja dengan file media apa pun yang dapat ditangani Mplayer. Satu liner berikut akan mengembalikan panjang trek dalam hitungan detik.

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

Anda dapat menggunakan ffmpeg untuk mendapatkan durasi file. Cukup gunakan:

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

Saya memiliki masalah yang sama dan menemukan perintah mplayer (goldPseudo) bekerja dengan baik, tetapi saya kemudian menemukan bahwa jika Anda membuka album di RhythmBox Anda akan melihat baris statusnya memberikan jumlah trek, total waktu bermain dan ukuran disk.

AFH
sumber
-1

Berikut ini adalah penggunaan sederhana saya merujuk di atas.

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

Saya mengirim nilai itu ke variabel 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

Terima kasih banyak orang! Saya menggunakan ide dan pengetahuan Anda. Terima kasih telah membaca, Semoga harimu menyenangkan! ;)

Jeongpyo Lee
sumber