В наши дни можно легко связаться по видеосвязи практически с любой точкой мира. Но потребовалось много времени, чтобы технология достигла такого уровня. Я покажу, какие решения использовали инженеры в 1988 году, чтобы вы могли не только говорить, но и видеть своего друга или партнера во время разговора.
Однажды я увидел на YouTube обзор Sony PCT-15 — это устройство, сделанное в Японии, подключалось к обычной телефонной линии и позволяло не только разговаривать с собеседником, но также отправлять и получать изображения во время разговора. В то время высокоскоростная связь была доступна только для учреждений, военных и правительства, поэтому телефонная линия была единственным возможным способом связи с миром:
![Источник Popular Photography 1988 Источник Popular Photography 1988](https://habrastorage.org/getpro/habr/upload_files/024/5ea/879/0245ea879ff838fa85014fa993485739.png)
Как это работает? Давайте разберемся.
Декодирование
Видеообзор был опубликован на YouTube-канале Techmoan, который специализируется на ретро-устройствах. Но примечательным для меня был тот факт, что передача данных была слышна на видео. Я просто сохранил сигнал в WAV и решил проанализировать его с помощью Python.
Давайте сначала проверим форму сигнала:
import scipy.io.wavfile as wav
import scipy.signal as signal
import matplotlib.pyplot as plt
import numpy as np
fs, data = wav.read('videophone.wav')
plt.rcParams["figure.figsize"] = (20,6)
time = np.linspace(0, len(data) / fs, num=len(data))
plt.plot(time, data)
plt.xlabel("Time, sec")
plt.ylabel("Amplitude")
plt.title("Signal")
plt.show()
Сигнал в начале, вероятно, используется в качестве триггера для начала приема. На волновой форме мы также можем видеть серию "пиков":
![](https://habrastorage.org/getpro/habr/upload_files/ffe/858/aca/ffe858aca8e05029d91cd64715c44a3c.png)
Проверим сигнал в частотной области:
plt.specgram(data, NFFT=1024, Fs=fs)
plt.title("Spectrum")
plt.xlabel("Time, sec")
plt.ylabel("Frequency")
plt.show()
Примечательно, что все данные передаются в полосе частот 1-3 КГц, которая была оптимальной для аналоговой телефонной линии:
![](https://habrastorage.org/getpro/habr/upload_files/a9d/d03/0c1/a9dd030c1b1e99a69aa97e7990f7031b.png)
Теперь вернемся к осциллограмме сигнала. Я могу предположить, что каждый "пик" представляет одну строку изображения, а данные передаются в аналоговой форме:
![](https://habrastorage.org/getpro/habr/upload_files/d1a/291/6e5/d1a2916e5870a37b0e33feea54e69f74.png)
Это был стандартный подход для аналогового телевидения в 80-х годах. Давайте увеличим один "пик". Очевидно, что это амплитудная модуляция. Я предполагаю, что она кодирует яркость, и это легко проверить. Сначала применим к данным преобразование Гильберта:
def hilbert(data):
analytical_signal = signal.hilbert(data)
amplitude_envelope = np.abs(analytical_signal)
return amplitude_envelope
data_am = hilbert(data)
plt.plot(time, data_am)
После преобразования мы получаем огибающую сигнала (желтая линия):
![](https://habrastorage.org/getpro/habr/upload_files/95a/c4f/bf7/95ac4fbf7d535111d7e159f1eb6623af.png)
Как я уже писал, сигнал, вероятно, кодируется яркостью — из спецификации устройства мы знаем, что Sony PCT-15 имеет монохромный экран, и одного канала яркости должно быть достаточно. Легко поместить одномерные данные на двухмерное изображение и посмотреть результат.
frame_width = 1211
w, h = frame_width, data_am.shape[0]//frame_width
image = Image.new('RGB', (w, h))
px, py = 0, 0
for p in range(data_am.shape[0] - 1):
lum = int(data_am[p]//128)
if lum < 0: lum = 0
if lum > 255: lum = 255
image.putpixel((px, py), (lum, lum, lum))
px += 1
if px >= w:
px = 0
py += 1
if py >= h:
break
image = image.resize((w//2, 4*h))
plt.imshow(image)
plt.show()
После выполнения кода мы можем увидеть закономерность:
![](https://habrastorage.org/getpro/habr/upload_files/904/62c/29c/90462c29cb021742e97618883d14bfe2.png)
Мне неясно, как работает синхронизация строк в реальном устройстве, я могу предположить, что PCT-15 использует заголовок данных для начала приема изображения. Формат заголовка мне неизвестен, поэтому я просто подправил параметр frame_width вручную в исходном коде.
И наконец, мы можем получить изображение:
![](https://habrastorage.org/getpro/habr/upload_files/f26/6e0/6a8/f266e06a88d184953af4ff7f37f70aaf.png)
Цифры 0...250 на изображении являются "виртуальными", они зависят только от частоты дискретизации записанного аудиофайла. Как мы знаем из спецификации, реальное разрешение изображения составляет всего 96x100, но устройство также может передавать изображения в режиме "высокого разрешения" 160x100. Я просил Techmoan в комментариях к видео поделиться образцом WAV "высокого разрешения", но владелец канала с количеством зрителей >1М не считает нужным отвечать на вопросы подписчиков, поэтому это единственный образец, который у меня есть. В любом случае, этого достаточно, чтобы оценить качество изображения.
Заключение
Было интересно проанализировать данные и посмотреть, что было "передовой" технологией в конце 80-х годов. Тогда не было ни Skype, ни WhatsApp, а скорость модемной линии составляла около 2400-14400 бит (не мегабит:) в секунду, что было явно недостаточно для "нормального" видеозвонка. А таких устройств, как "веб-камеры", вообще не было, их просто еще не изобрели. Поэтому инженеры Sony решили использовать для передачи и приема изображения аналоговую телевизионную передачу с низкой скоростью. Как мы видим, время передачи составляет около 6-10 секунд на изображение, что, очевидно, достаточно только для неподвижных изображений, но это было лучше, чем ничего - особенно для людей, живущих в разных странах или городах, это могло быть единственным способом видеть друг друга в "почти" реальном времени.
Я не знаю, были ли продажи Sony PCT-15 успешными в 80-х годах. Первая веб-камера была представлена позже, в 1994 году, так что вполне возможно, существовал маркетинговый спрос со стороны людей, которые хотели видеть друг друга в то время, когда цифровые и веб-камеры еще не были доступны. С другой стороны, черно-белое изображение с разрешением 160х100, которое передается примерно за 10 с, звучит не очень здорово даже для 80-х годов. В любом случае, совершая видеозвонок со смартфона на отдыхе, приятно вспомнить, как зарождалась эта технология, и проникнуться уважением к инженерам и ученым, которые сделали ее простой и возможной.
Как мы видим из статьи, для декодирования "передовой" технологии конца 80-х годов, использовался современный язык программирования Python. В OTUS вы можете изучить не только Python, но и другие популярные языки программирования, а также пройти курсы по инфраструктуре, тестированию, базам данных, управлению, информационной безопасности и еще ряду направлений. Прямо сейчас на нашем сайте действуют летние скидки, поэтому приглашаем вас ознакомиться с предложением по ссылке ниже.
![https://otus.pw/3tkp/ https://otus.pw/3tkp/](https://habrastorage.org/getpro/habr/upload_files/10e/3b7/0f9/10e3b70f95cd7a56a260ca0a7f5a56f3.png)