Отримайте 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.