Этот вопрос довольно научный (хотя и довольно простой) и не настолько тривиальный для реализации.
Первое, что нужно отметить: у вас на самом деле есть третья шкала времени - системное время.
Второе, на что следует обратить внимание: вы не можете непосредственно найти метку времени видео, которая соответствует данной звуковой метке времени и наоборот , но вы можете напрямую найти системное время, которое соответствует только что прибывшей метке времени видео или только что прибыл аудио отметка времени.
Таким образом, вы (1) находите линейное преобразование из шкалы времени видео в системное время и (2) из шкалы времени аудио в системное время.
Теперь вы можете найти преобразование из видео-меток в аудио-метки или наоборот.
Затем вам нужно выбрать эталонную шкалу времени - видео, аудио или системное время. При необходимости вы конвертируете метки времени любой шкалы времени в эталонную шкалу времени.
ПРИМЕЧАНИЕ , что каждый отдельный аудиосэмпл имеет свою собственную временную метку, которую следует преобразовать в новый временной масштаб, чтобы выходная частота дискретизации не совпадала с частотой входной выборки. А поскольку ваше линейное преобразование, вероятно, будет адаптивным - частота дискретизации на выходе будет отличаться для разных аудиопакетов. Все это означает, что если ваша эталонная шкала времени не является шкалой времени звука, вы должны тщательно заново сэмплировать каждый аудиопакет на (постоянную) частоту дискретизации по вашему выбору с помощью алгоритма по вашему выбору (например, линейного или более продвинутого). В противном случае, если вы предположите, что частота дискретизации не изменилась - у вас будут пропуски и / или совпадения между аудиопакетами (что приведет к очень неприятным звуковым артефактам).
Наиболее важной подзадачей этого подхода является линейное сокращение: поиск наилучшего линейного преобразования между x
и y
при заданном наборе точек выборки (x,y)
.
Эта задача обычно определяется следующим образом: для заданного набора точек (x n , y n ) find (k, b ) , чтобы сумма (y n - (k * x n + b)) 2 была минимальной ( минимальная сумма квадратов-разностей).
Ответ
k = (M (x * y) - M (x) * M (y)) / (M (x 2 ) - (M (x)) 2 ), b = (М (у) (М (х 2 ) - М (х * у) * М (х)) / (М (х 2 ) - (М (х)) 2 )
где M (f) обозначает среднее арифметическое всех f n значений.
Практически больше точек (x n , y n ) означает более точную линейную модель. Ошибка очень сильно зависит от значения (M (x 2 ) - (M (x)) 2 ) (большое значение означает небольшую ошибку). Таким образом, вы должны применять эту формулу только тогда, когда у вас достаточно очков - так, чтобы значение (M (x 2 ) - (M (x)) 2 ) становится больше некоторого предельного значения.