Отримайте MP3 довжину в Linux / FreeBSD


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 =":

$ 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 '/ Тривалість / {print substr ($ 2,0, довжина ($ 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друку загальної довжини аудіо у всіх файлах, за секунди. Напевно, це можна зробити більш ефективно, але оскільки я написав це як разовий, це було досить добре для моїх потреб. (Другий виклик awk позбавляє десяткових знаків, тому результат не на 100% точний, але, знову ж таки, достатньо хороший для моїх потреб.)
— CVn

Остерігайтеся прапора ffmpeg -аналізування. В основному, цифри, про які він повідомляє, є оцінками після певного моменту, щоб зберегти ЦП.
— mlissner

Використовуючи MP3 з середнім бітком, ffmpeg повідомляє про неправильну тривалість разом із цим попередженням Estimating duration from bitrate, this may be inaccurate. Я думаю, що ця відповідь справедлива лише у форматі MP3 з постійним бітком .
— KrisWebDev

9

Цікаво, що програма EXIFTool надає тривалість MP3 як останній рядок!

$ exiftool somefile.mp3
Номер версії ExifTool: 7.98
Назва файлу: somefile.mp3
Каталог:.
Розмір файлу: 49 Мб
Дата / Час зміни файлу: 2009: 09: 10 11: 04: 54 + 05: 30
Тип файлу: MP3
MIME Тип: аудіо / mpeg
Версія MPEG Audio: 2.5
Звуковий шар: 3
Аудіобіт: 64000
Частота вибірки: 8000
Режим каналу: Одноканальний
MS Stereo: вимкнено
Стерео інтенсивності: вимкнено
Прапор авторських прав: Неправдиво
Оригінальний носій інформації: Правда
Акцент: Ні
Розмір ID3: 26
Жанр: Блюз
Тривалість: 1:47:46 (приблизно)

3

Ще один спосіб отримати тривалість лише за допомогою ffmpegта 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, вважають мене трохи крихкими, оскільки вони розбирають вихід, який не зовсім розроблений як інтерфейс. Однак вони, мабуть, продовжуватимуть працювати протягом кількох років, незалежно.

ffmpegпоставляється з інструментом ffprobeдля отримання інформації про аудіофайли (безліч форматів, включаючи 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
— Gyan

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

Дякую вище людей! Я використовую ваші ідеї та знання. Дякую за прочитане, приємного дня! ;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.