Извлечение аудиофрагментов из mp3-файла — неожиданные результаты

Извлечение аудиофрагментов из mp3-файла — неожиданные результаты

Я пытаюсь извлечь аудиофрагменты с помощью инструментов командной строки. Я получаю последовательные, неожиданные результаты, и я считаю, что это связано с тем, как были созданы/закодированы аудиофайлы.

Примечание: Я понимаю, что существуют и другие подходы к распространению контента, но я делаю это таким образом, чтобы предоставить доступ к контенту пользователям, которые либо не очень хорошо разбираются в компьютерах, либо имеют геоблокировку для доступа к исходному контенту.

Описание проблемы/Шаги воспроизведения:

  • Я начинаю с использования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вообще не нужно начинать с этого в данном случае.

Связанный контент