
Я пытаюсь извлечь аудиофрагменты с помощью инструментов командной строки. Я получаю последовательные, неожиданные результаты, и я считаю, что это связано с тем, как были созданы/закодированы аудиофайлы.
Примечание: Я понимаю, что существуют и другие подходы к распространению контента, но я делаю это таким образом, чтобы предоставить доступ к контенту пользователям, которые либо не очень хорошо разбираются в компьютерах, либо имеют геоблокировку для доступа к исходному контенту.
Описание проблемы/Шаги воспроизведения:
Я начинаю с использованияyt-dlpчтобы загрузить подкаст, напримерВот этотс помощью этой команды:
yt-dlp -x --audio-format mp3 -o GQT_2012-10-14.mp3 https://www.bbc.co.uk/programmes/b01n6vnh
Файл загружен и воспроизводится правильно. Я хотел бы извлечь фрагмент, который начинается в 20:48 и длится 03:58, поэтому он заканчивается в 24:46
Я попробовал это сначала, используяFFmpeg(версия 4.2.7-0ubuntu0.1 в Ubuntu 20.04) с помощью этой команды:
ffmpeg -i "/home/user/GQT_2012-10-14.mp3" -ss 00:20:48 -t 00:03:58 GQT_2012-10-12_Snippet1.mp3
Это создаст файл длиной 3 минуты 58 секунд, но время начала соответствует 20:28 в исходном файле.Затем я попробовал использоватьMp3Splt(версия 2.6.2 на той же ОС. Я знаю, что это старая версия) с помощью этой команды:
mp3splt "/home/user/GQT_2012-10-14.mp3" -o GQT_2012-10-12_Snippet1 20.48.00 24.46.00
Это генерирует тот же вывод, файл правильной длины, но на 20 секунд раньше ожидаемого времени начала.
Учитывая одинаковые результаты обоих инструментов командной строки, это говорит о том, что проблема заключается во входном файле. Я попытался проверить его с помощью ffprobe
. В выводе я увидел следующее:
Duration: 00:43:00.09, start: 0.025057, bitrate: 141 kb/s
Я интерпретирую это как файл, «помеченный» как начинающийся через 25 миллисекунд. Определенно не через 20 секунд.
Я все равно пытался сбросить это на ноль, пробуя разные вариантыэтот ответ, мне это не удалось.
Я пытаюсь понять основную причину ошибки в извлеченных фрагментах и исправить ее.
решение1
Я провел несколько тестов с предоставленным вами файлом и считаю, что ваша команда ffmpeg на самом деле обрезает файл именно в том месте, где вы ее указываете.
Я считаю, что настоящая проблема здесь заключается в том,игрокипоказывает неправильную временную метку при поиске (я пробовал vlc
и mplayer
, и они, похоже, ведут себя одинаково): Если я позволю vlc
воспроизвести файл с начала без поиска вперед (я на самом деле позволил ему работать в фоновом режиме в течение 20 минут!), когда он достигнет 20:48, он окажется в точно той же позиции, где начинается файл, созданный ffmpeg! Если вместо этого я начну воспроизведение в vlc
и пропущу вперед, это место будет представлено как 20:28! Я предполагаю, что поиск на этих проигрывателях просто переходит к следующему ключевому кадру (или чему-то подобному? Не очень хорошо знаком с внутренним устройством формата mp3) и просто оценивает прошедшее время на основе битрейта (который является переменным). Вы можете очень хорошо продемонстрировать этот эффект, запустив vlc и выполняя поиск близко к концу и увидев, что vlc продолжает воспроизводить после 43 минут (я пробовал искать с 42:42, и он воспроизводился до 43:08).
Вкратце, для получения точного времени в mp3, использование временных меток, показанных проигрывателем, например, vlc
или, mplayer
кажется, не является хорошим вариантом. Вместо этого вы можете использовать какую-нибудь программу для редактирования аудио, напримерaudacity
, который декодирует весь файл в начале, поэтому тайминги там должны быть точными. Конечно, вы можете использовать его и для части резки, так что вам ffmpeg
вообще не нужно начинать с этого в данном случае.