Відповіді:
З ffmpeg немає ніякого способу я знати, як отримати довжину як змінну, яку можна використовувати в сценарії. Але mp3info робить.
mp3info -p "%S" sample.mp3 // total time in seconds
\n
для друку нового рядка. > mp3info -p "%S\n" sample.mp3
// загальний час у секундах
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
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% точний, але, знову ж таки, достатньо хороший для моїх потреб.)
Estimating duration from bitrate, this may be inaccurate
. Я думаю, що ця відповідь справедлива лише у форматі MP3 з постійним бітком .
Цікаво, що програма 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 (приблизно)
Рішення, що використовують ffmpeg
, вважають мене трохи крихкими, оскільки вони розбирають вихід, який не зовсім розроблений як інтерфейс. Однак вони, мабуть, продовжуватимуть працювати протягом кількох років, незалежно.
ffmpeg
поставляється з інструментом ffprobe
для отримання інформації про аудіофайли (безліч форматів, включаючи mp3), і може виробляти машиночитаний вихід. Наступна команда отримує тривалість пісні.
ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'
ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Я особисто використовую Mplayer для отримання інформації, в основному тому, що я вже встановив її і не можу заважати встановлювати нове програмне забезпечення без потреби. Перевагою цього є те, що він не обмежується, зокрема, mp3-файлами, і повинен працювати з будь-яким медіа-файлом, з яким може працювати Mplayer. Наступний однолінійний маршрут поверне довжину доріжки за секунди.
mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2
Ви можете використовувати ffmpeg, щоб отримати тривалість файлу. Просто використовуйте:
ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//
Ось мій простий, використовуючи перегляд вище.
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
Дякую вище людей! Я використовую ваші ідеї та знання. Дякую за прочитане, приємного дня! ;)