Как объединить два совершенно разных mp3-файла (разность битрейта, каналы, частота дискретизации, битдеф)?
blockquote>Давайте начнем с каждого компонента ...
битрейт
blockquote>Это не имеет значения. Потоки MP3 могут (и делают!) Изменять битрейт в среднем потоке. Пока вы присоединяетесь к заголовку фрейма, все в порядке.
bitdepth
blockquote>Концепция глубины в битах семплов не существует в MP3. Вы можете записывать в 24-битном формате, кодировать в MP3, а декодер будет декодировать в 16-битном формате. (Или с некоторыми переключателями командной строки, наоборот!) Это не проблема, потому что битовая глубина не применяется.
частота дискретизации
blockquote>Обычно это проблема. Большинство игроков не предполагают, что они собираются изменить частоту дискретизации в середине потока. Большинство игроков не пытаются повторить выборку, чтобы придерживаться скорости, с которой они уже выводили. Я не удивлен, что у вас возникнут проблемы с изменением частоты дискретизации.
channel
blockquote>Это похоже на проблему с частотой дискретизации, поскольку требует изменения конфигурации устройства вывода. Даже если игрок поддерживает это, это не будет гладко. (Если только вы не переходили от стерео к моно, где моно можно было легко микшировать на стерео.)
В качестве входных данных я получаю один файл mp3 (input.mp3), затем мне нужно разделить его на две отдельные части (сделано это) и вставьте между этими частями еще один mp3 (second.mp3).
blockquote>На самом деле это еще одна проблема, о которой вы не спрашивали ... время. MP3 работает в относительно больших кадрах (обычно 576 сэмплов), что становится разрешением, при котором вы можете склеивать. Нехорошо. Кроме того, начало дорожек часто имеет один или два кадра инициализации.
Третий вопрос - битовый резервуар. Именно здесь содержимое из одного кадра хранится в другом кадре, который может иметь дополнительное пространство.
В конце дня вам придется декодировать все в обычные сэмплы PCM, выполнять сплайсинг и перекодировать в MP3. Вы также должны будете повторно сэмплировать все на общую тактовую частоту и смешать с определенным количеством каналов. К счастью, когда-то декодированный в PCM, это все тривиально и стандартно. Как только ваши входные потоки совместимы, вы произвольно соединяете кадр PCM, который является наиболее детализированным из возможных.
Я использую 0.5.1 и у меня работает следующее:
class EventController {
def authenticateService
def list = {
def user = authenticateService.principal()
def username = user?.getUsername()
.....
.....
}
}
В настоящее время это не задокументировано, но в установочном файле плагина есть 3 метода, которые он добавляет к каждому контроллеру, чтобы вам на самом деле не приходилось внедрять аутентификационную службу:
private void addControllerMethods(MetaClass mc) {
mc.getAuthUserDomain = {
def principal = SCH.context?.authentication?.principal
if (principal != null && principal != 'anonymousUser') {
return principal?.domainClass
}
return null
}
mc.getPrincipalInfo = {
return SCH.context?.authentication?.principal
}
mc.isUserLogon = {
def principal = SCH.context?.authentication?.principal
return principal != null && principal != 'anonymousUser'
}
}
Это означает, что что вы можете просто позвонить
principalInfo
, чтобы получить основной объект. Он также имеет «isUserLogin», чтобы видеть, зарегистрирован ли пользователь, и «authUserDomain», чтобы получить фактический экземпляр класса домена (Person / User), связанный с принципалом вошедшего в систему пользователя.