Как объединить два совершенно разных mp3-файла (разность битрейта, каналы, частота дискретизации, битдеф)? - PullRequest
0 голосов
/ 05 марта 2019

В качестве входных данных я получаю один mp3-файл (input.mp3), затем мне нужно разделить его на две отдельные части (готово) и вставить между этими частями другой mp3 (second.mp3).

проблема: я пытался использовать каждую команду для объединения файлов, преобразования их в .ts и т. д., но я всегда получаю только звук первого mp3-файла, а звук второго теряется.Я предполагаю, что мне нужно преобразовать мой mp3-файл в тот же формат, что и файл input.mp3 (битрейты, частоты дискретизации, число каналов), прежде чем я смогу соединить его с ним.

Я мог бы объединить две частиinput.mp3, но независимо от того, что я делаю, я не могу объединить с second.mp3.

Я использую php с файлом exec и ffmpeg.exe.Можно ли его закодировать, чтобы независимо от ввода я мог преобразовать second.mp3 в подходящий для объединения mp3?

Ответы [ 2 ]

1 голос
/ 05 марта 2019

Как объединить два совершенно разных mp3-файла (разность битов, каналы, частота дискретизации, битдеф)?

Давайте начнем с каждого компонента ...

битрейт

Этот не имеет значения.Потоки MP3 могут (и делают!) Изменять битрейт в среднем потоке.Пока вы присоединяетесь к заголовку кадра, все в порядке.

bitdepth

Понятие глубины в битах семплов не существует в MP3.Вы можете записывать в 24-битном формате, кодировать в MP3, а декодер будет декодировать в 16-битном формате.(Или с некоторыми переключателями командной строки, наоборот!) Это не проблема, потому что битовая глубина не применяется.

частота дискретизации

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

каналов

Это похоже на проблему с частотой дискретизации в том, что она требует измененияконфигурация устройства вывода.Даже если игрок поддерживает это, это не будет гладко.(Если только вы не переходили от стерео к моно, где моно можно было легко микшировать на стерео.)

В качестве входных данных я получаю один файл mp3 (input.mp3), затем мне нужно разделить его надве отдельные части (сделали это) и вставьте между этими частями еще один mp3 (second.mp3).

Это фактически создает еще одну проблему, о которой вы не спрашивали ... время.MP3 работает в относительно больших кадрах (обычно 576 сэмплов), что становится разрешением, при котором вы можете склеивать.Нехорошо.Кроме того, начало дорожек часто имеет один или два кадра инициализации.

Третья проблема - это битовый резервуар.Именно здесь содержимое из одного кадра хранится в другом кадре, который может иметь дополнительное пространство.

В конце дня вам придется декодировать все в обычные образцы PCM, сделайте свое соединение,и перекодировать в MP3.Вы также должны будете повторно сэмплировать все на общую тактовую частоту и смешать с определенным количеством каналов.К счастью, когда-то декодированный в PCM, это все тривиально и стандартно.Как только ваши входные потоки совместимы, вы произвольно соединяете кадр PCM, который является наиболее детализированным из возможных.

0 голосов
/ 05 марта 2019

Используйте фильтры atrim , asetpts и concat :

ffmpeg -i input.mp3 -i second.mp3 -filter_complex "[0:a]atrim=end=10,asetpts=N/SR/TB[begin];[0:a]atrim=start=10,asetpts=N/SR/TB[end];[begin][1:a][end]concat=n=3:v=0:a=1[a]" -map "[a]" output

Примечание. Все соответствующие потоки должны иметь одинаковые параметры во всех сегментах; система фильтрации автоматически выберет общий формат семплов, частоту семплов и схему каналов для аудиопотоков. Эти общие параметры будут различаться в зависимости от входных параметров, поэтому добавьте фильтр aformat (или эквивалентный), если вы хотите получить согласованные результаты:

ffmpeg -i input.mp3 -i second.mp3 -filter_complex "[0:a]atrim=end=10,aformat=sample_rates=44100:channel_layouts=stereo,asetpts=N/SR/TB[begin];[1:a]aformat=sample_rates=44100:channel_layouts=stereo[middle];[0:a]atrim=start=10,aformat=sample_rates=44100:channel_layouts=stereo,asetpts=N/SR/TB[end];[begin][middle][end]concat=n=3:v=0:a=1[a]" -map "[a]" output
...