Вопрос по – Как получить реальную, фактическую продолжительность файла MP3 (VBR или CBR) на стороне сервера

21

Раньше я вычислял длительность серверных MP3-файлов с помощью ffmpeg, что, похоже, работало нормально. Сегодня я обнаружил, что некоторые из расчетов были неверными. Почему-то по какой-то причине ffmpeg неправильно рассчитает длительность, и, похоже, это происходит только с mp3-файлами с переменной скоростью.

При локальном тестировании я заметил, что ffmpeg напечатал две дополнительные строки зеленым цветом.

Используемая команда:

ffmpeg -i song_9747c077aef8.mp3

ffmpeg говорит:

[mp3 @ 0x102052600] max_analyze_duration 5000000 reached at 5015510
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate

После хорошей, теплой сессии Google я обнаружил несколько сообщений на эту тему, но решения не было найдено.

Затем я попытался увеличить максимальную продолжительность:

ffmpeg -analyzeduration 999999999 -i song_9747c077aef8.mp3

После этого ffmpeg вернул только вторую строку:

[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate

Но в любом случае рассчитанная продолжительность была просто неправильной. Сравнивая это с VLC, я заметил, что там правильная продолжительность.

После дополнительных исследований я наткнулся на mp3info - которую я установил и использовал.

mp3info -p "%S" song_9747c077aef8.mp3

mp3info затем вернулCORRECT длительность, но только как целое число, которое я не могу использовать, поскольку мне нужно более точное число здесь. Причина этого была объяснена в комментарии ниже пользователемblahdiblah - mp3info просто извлекает информацию ID3 из файла и фактически не выполняет никаких вычислений.

Я также пытался использовать mplayer для получения длительности, но, как и ffmpeg, mplayer возвращает неправильное значение.

Ааа, тогда я думаю, что вам нужно будет просмотреть mp3 и найти каждый кадр, а затем вычислить длительность. 1321941
mp3info - это не то, что вы ищете, а просто извлекает информацию из тегов ID3 и заголовков MP3. blahdiblah
Спасибо, но я не могу принять правильную информацию о продолжительности в тегах заголовков MP3 / ID3, даже если бы захотел. Я должен рассчитать его, чтобы получить 100% точный результат. SquareCat
id3.org 1321941
Спасибо за ваш вклад, но причина, по которой я ищу готовое решение, заключается в том, что это именно то, чего я не хочу (должен) делать. SquareCat

Ваш Ответ

4   ответа
0

родолжительностью в его тег ID3. Это заставляет его писать правильную информацию.

ffmpeg -i "audio.mp3" -acodec copy "audio_fixed.mp3"

Поскольку он использует копирование, это занимает часть времени, которое занимает оригинальная кодировка. Это едва заметно в песне, но вы действительно оцените ее с 7-часовой аудиокнигой. После повторного кодирования ID3 "Длительность" тег теперь содержит правильную информацию.

20

используя sox - который возвращает правильную информацию.

sox file.mp3 -n stat
Samples read:          19321344
Length (seconds):    219.062857
Scaled by:         2147483647.0
Maximum amplitude:     1.000000
Minimum amplitude:    -1.000000
Midline amplitude:    -0.000000
Mean    norm:          0.141787
Mean    amplitude:     0.000060
RMS     amplitude:     0.191376
Maximum delta:         0.947598
Minimum delta:         0.000000
Mean    delta:         0.086211
RMS     delta:         0.115971
Rough   frequency:         4253
Volume adjustment:        1.000

Length (seconds): 219.062857

Выводитsox FAIL formats: no handler for file extension mp3 по умолчанию. Как мне его установить?
Если вам нужно более быстрое решение (кажется, что sox прочитает все примеры из файла), проверьте решение с помощью NAudio - mono работает на linux без проблем, это должно быть выполнимо ...
10

чтобы получить фактическую продолжительность:

ffmpeg -i input.mp3 -f null -

От второй до последней строки вывода консоли будет отображаться что-то вроде:

size=N/A time=00:03:49.12 bitrate=N/A

кудаtime фактическая продолжительность В этом примере весь процесс занял около 0,5 секунд.

1

вы можете добавить флаги -v quiet -stats

ffmpeg -v quiet -stats -i input.mp3 -f null - 

Похожие вопросы