三菱VisiTel:1980年代Zoom Communication

窗外是2020年。远程工作已经完全正常。数十年来,领先电信公司的广告终于完成了他们的工作-教我妈妈如何进行视频通话。没错,最近几个月发生的事件引起了公众对视频通信的意外兴趣,导致网络摄像头的空前短缺。但是我们不能允许这阻止我们过正常的生活。毕竟,我们每个人都需要打电话给很多人。对于缺乏网络摄像头的问题,我有解决方案。这是三菱VisiTel!





三菱VisiTel



当该设备于1988年出现时,它绝对代表了未来。而其低廉的价格(仅399美元)又怎能立即流行呢?在1988年2月出版大众力学杂志上,整页专门介绍了三菱VisiTel。在那里描述了该设备,并提及了大量的技术细节。和主持人小工具大师的WSMV电视频道,之后立即开始他们谈论VisiTel,问了一个非常重要的问题:“我可以继续使用普通电话,而这个东西连接线?”



我们花了30年的时间和一个全球性的大流行病,终于接受了一个不可避免的事实,那就是在给同事打电话之前,我们需要洗个澡,使自己井井有条。现在,无论怎么说,视频电话都离不开。



我不是第一个认为VisiTel特别令人讨厌的人。人们已经 修补与该设备的时间。尽管它不传输视频信号,而仅允许您共享照片,但它还是被认为是工程学上杰出成就的那些产品之一。这是远远领先于时代的发展。



我在VisiTel兴趣后出现视频。它的作者展示了如何通过减慢或加快对VisiTel发送的图像的捕获来使屏幕上的图像失真。得知这一点后,我立即意识到该设备使用了一种简单的幅度调制方案。知道了这一点,我去了eBay,在那里找到了合适的VisiTel副本。我的目标是结合1980年代后期的技术进步和我选择的现代技术,制作出这种惊人的“时间胶囊”。我特别想组织与Zoom同事的交流。此外,我想实现这一目标而不必修改VisiTel硬件。该设备有一些特殊之处,例如,您想保留其原始形式。



步骤1.连接





开始尝试使用VisiTel



VisiTel非常容易安装和运行。从设备的背面穿过一根长电缆,该电缆的末端有一个Y形分离器(下面有更多内容)和一对连接器。其中之一是2.1毫米电源连接器。该设备需要15伏特。奇怪的是,设备的开发人员决定将数字15写成这样的字体,以致铭文显示为“ IS Volts”。第二个连接器是常规RJ-11,它使用两个引脚。这是标准的电话插孔。如果您记得普通的有线电话,则还可以记住,听筒是使用RJ-9连接器连接到设备的,电话是通过RJ-11连接器连接到线路的。其含义是,不仅可以将听筒连接到电话,还可以将其他东西连接,以及以便在发生故障时可以更换电缆或套管。没错,不能说从电话到手机的电缆经常发生故障,因为在制造过程中使用了非常柔软的特殊电线。





VisiTel





, VisiTel



回到VisiTel的背面,除了电缆外,还有一个RJ-11连接器。我想了一会儿为什么需要他之后,我就意识到了。该设备充当常规电话机和电话线之间的中介。这样,VisiTel可以在常规电话通话期间监视线路或传输图像。这导致一个明显的问题。即,我们正在谈论的事实是,由于VisiTel与电话同时使用电话线,因此订户将听到伴随图像接收和发送的声音。但是三菱的工程师负责这一点。在发送或接收图像之前,您会听到一声巨响,表明某种继电器会暂时关闭电话。我们将使用VisiTel,以使从设备接收到的音频信号对我们而言并不有趣,因此我们不会将任何东西连接到设备背面的RJ-11连接器。这使得不需要相应的中继,这意味着可以将其删除以消除与发送图像相关的咔嗒声。



如何组织与此设备的数据交换?例如,我的计算机没有RJ-11连接器。没错,这并不可怕,因为有适配器出售,用于将带有RJ-9连接器的手机连接到智能手机。连接选项之一是,您可以切断RJ-11连接器并将3.5mm的插头焊接到电线上,以组织单声道音频传输。请注意,我最初以为VisiTel具有RJ-9连接器而不是RJ-11连接器。



使用3.5毫米插头,将VisiTel连接到计算机非常容易。即,您需要获得一个具有单独输出的USB适配器,用于连接麦克风和耳机(不是TRSS),并将VisiTel连接到合适的连接器。



以上,我说过我将回到Y形分离器。我的VisiTel的分离器周围的电线存在某种问题。此外,当一切都无法正常工作,并且问题完全明显时,电线也不会断裂。这是令人不愉快的故障之一,在晚上,一切正常,第二天早上不再起作用。如果VisiTel的创建者在他们的产品中使用特殊的软线,那就太好了。这个问题的出现和消失,使我花了很多天时间毫无意义地寻找解决方案。我搜索了过热问题,但没有成功设备,请检查声卡设置三遍。我在测试过程中抬起设备时最终发现了问题。之后,我在录音中发现了断线的典型征兆。我从这个故事中学到了关于使用旧硬件的一课。其原因在于,在设备操作期间,您需要稍微移动一下,看看此时所有功能是否与以前相同。





电线损坏的地方标有圆圈



步骤2.研究图像传输机制



解决了棘手的电线问题并将设备连接到计算机后,现在该弄清楚使用哪种协议对传输的图像进行编码了。有关VisiTel的视频和文章使我们得出结论,图像是使用音频信号的幅度调制进行编码的。调幅是通过改变载波信号的幅度来执行的数据编码。调幅通常用于编码使用无线电波传输的声音,但是可以使用相同的方法来使用无线电波甚至声波传输图像。这里您可以通过Python代码示例找到有关此过程的出色详细描述,这些示例供那些习惯于通过实践学习新事物的人使用。



知道数据是使用音频信号的AM调制机制编码的,我们可以迈出解码该数据的第一步。该步骤包括记录调制信号,该信号传输具有先前已知特性的样本图像。为了捕获音频,我使用了我通常的音频软件Audacity





音频信号的图形表示



上面显示了我如何更好地理解数据编码方式,该方法是如何从VisiTel发送非常简单的,特别准备的图像。这张图片如下图所示,是一对黑白相间的卡片,我把它们放在设备相机的前面。在程序中将与之相对应的信号标记为blackWhiteV





实验中使用的图像



让我们仔细看一下接收到的音频信号。





仔细查看音频信号



您可以在此处收听此信号



如您所见,在每个块的开头都有一个标头或序列,指示初始化(在此示例中为17.55至17.80)。这使接收设备知道另一个设备将要发送图像并确定最大信号幅度。然后,在对图像进行解码时,将该指示符用作缩放因子。结果,电话线的缺陷不会导致对比度或亮度的图像损失。在某些线路上传输的信号可能有噪声或减弱。请注意,高达17.55的信号只是噪声,对于VisiTel使用的数据协议而言并不重要。



为了确保我发现的报头序列确实向VisiTel指示另一台设备将向其发送图像,我让该设备仅听一小段录音,并通过中继单击来获得奖励。显然,该序列启动了一些机制。但是在仅向设备发送标头的30毫秒后,我意识到设备检测到标头之后的图像未发送。标头传输结束后,继电器将关闭几毫秒。如果您播放标题及其后的声音的前几毫秒,则VisiTel将开始在屏幕上显示图像。如果您在设备在屏幕上显示图像时关闭声音,则工作将继续,VisiTel继续接收一些数据,直到用于存储图像的缓冲区已满。这再次证明,在VisiTel开始处理图形数据之后,该设备不再依赖外部振荡器来精确地找到信号中需要编码的位置。他有自己的时钟发生器,可将他精确地指向所需的位置。他到底需要什么。他到底需要什么。



由于信号的标题部分仅负责建立连接,并且鉴于它不依赖于所传输的图像,因此我不想深入研究其功能。对我们来说,要实现我们的目标,只需知道标头负责建立连接就足够了,并且对它的外观有一个大概的了解就足够了。



现在是时候进行最困难的部分了-确切地找到图形信息是如何编码的,像素是如何“听起来”的。首先,我需要了解如何在音频信号中表示像素数据。我的第一个猜测是每个完整的波代表一个像素。我通过计算测试图案重复之间的波数来测试这个想法。我得到的是与旧广告中的VisiTel规格一致的。即,它是96x96像素,在图像本身开始之前输出了几行。



所有这些都意味着该设备可以分析每个波的幅度,并以缓冲像素的形式写入数据,该像素代表VisiTel中的数字图像。我们从VisiTel营销材料中知道,它显示的图像中的每个像素都有16种灰度。但是我分析来自“模拟”信号的像素时,并没有感到在解码或编码时需要应用后代化效果。



有趣的是,像素的亮度在调制之前反转。结果,最大的波对应于最暗的像素。另外,图像从左向右反射,即,形成镜像。我想知道此材料的读者对在传输信号之前反转像素亮度的原因有何看法。我怀疑这是因为人类对随机分散的黑色像素的视觉比白色像素的图像更平静。毕竟,电话线上的噪声是VisiTel肯定在1988年必须解决的一个问题。





信号调查



但是,上述图像编码方案有一个例外,使我无法理解数周。通过这种反向编码方案,完美的白色像素应由静音表示。不应有代表此类像素的信号。但是我感到VisiTel的创建者不喜欢这个想法。取而代之的是,为了编码全白像素,将载波信号移动了1/4波长,导致这种波与正常波异相。在这种情况下,可以像以前一样将信号发送到另一个设备。接收到此类信号的接收设备与“正常”信号保持同步,并在与平时相同的位置上获取了有关信号幅度的信息,但是现在这些时刻波通过了0,像素变为白色。正如我已经说过的,如果在图像传输期间关闭声音,则VisiTel会继续显示图像,直到缓冲区已满。这些是白色像素。结果是,即使在线路中不存在有用信号的情况下,该设备也将其感知为白色。我不知道为什么设备的创造者决定通过将这种相移模式引入调制方案来使其复杂化。对于我来说,为此付出了很多努力,但是从这一步骤中没有任何好处,或者这是微不足道的。为此,设备的创建者决定通过将这种相移模式引入调制方案来使其复杂化。对于我来说,为此付出了很多努力,但是从这一步骤中没有任何好处,或者这是微不足道的。为此,设备的创建者决定通过将这种相移模式引入调制方案来使其复杂化。对于我来说,为此付出了很多努力,但是从这一步骤中没有任何好处,或者这是微不足道的。



我不了解相移调制,最初尝试查找每个波的最大值,并将结果值表示为像素。换行符由公式计算得出96*( )。这导致在某些行中像素多一点或少一点的事实。此外,这种粗略的信号分析方法对噪声非常敏感,因为即使波中的峰值很小,也可能导致出现多余的像素。没错,这种图像解码机制非常容易实现。实现这个简单的想法可以解码图像,而无需同步接收器和源。但是在应用了这样的信号解码系统之后,我什么都没有发生。



为了更准确地解码图像,我们需要执行与VisiTel相同的操作。即,您需要在报头处理时与信号同步,然后以固定间隔对信号进行采样。毫不奇怪,这种信号处理需要非常精确的定时。在我的情况下,当记录频率为44100 Hz的声音时,每个波有25.23158个采样(这意味着载波的频率为1747.80968929 Hz)。结果,每次读取有关像素的信息时,我们都会在音频缓冲区中查找下一个像素的数据,该数据与上一个像素的距离为25.23158个样本。由于样本位置由整数值描述,因此我们只需将相应的数字四舍五入为最接近的整数并使用它。这里最重要的是防止舍入误差累积,因为这将导致采样位置相对于声波快速移相。并且,如果在图像解码期间发生了类似的位移,尽管位移很小,但最终的图像将充满伪像。





充满伪影的图像



对我来说幸运的是,每个波的样本数量非常稳定。设备预热后它没有改变,尽管我担心这可能是个问题。这种稳定性使我可以简单地在图像解码代码中对相应的值进行硬编码。理想情况下,应该从标题中了解每个波形的样本数量,但是我发现样本数量不足以达到5个小数位的精度。硬编码的值使获得稳定的结果成为可能。由于信号解码系统的这种更准确的实现,在生成1个像素的函数被调用96次之后,只需执行换行。



到目前为止,我已经处理过从WAV文件解码的预录音频片段。为了交互工作并解码进入计算机音频接口的图像,解码器必须具备检测标头并找到图像数据开头的功能。如果您查看标题,结果发现其中有三个清晰可辨的片段。





标头分析:载波-静默-载波



为了检测到这一点,我实现了一个简单的基于FFT的检测器和状态机。首先处理原始材料,然后检测器检查音频信号的每个块,直到找到一个强1747 Hz信号。然后检查这些块,直到找到信号消失然后重新出现的位置。这意味着找到开始传输的时刻。此后,使用简单的静态偏移量来查找图像数据传输的开始时间,并使用上述机制对图像进行解码。解码完成后,将显示图像,并将状态机重置为其原始状态,并等待下一次传输开始。



步骤3.将VisiTel呈现为网络摄像头



既然我们已经能够解码从VisiTel接收到的图像,那么剩下的就是将难题的最后一部分放到位。我们需要以视频帧的形式呈现解码图像,并将视频流传输到视频会议程序。在Linux上,这非常容易。视频输入是通过V4L2接口抽象的,但是不幸的是,这发生在内核空间中。为了不参与与创建内核模块相关的复杂性,可以使用现成的解决方案-v4l2loopback... 该模块既是输入设备又是输出设备。传递给它的图形输入成为其他程序(如Zoom)可以接受的输出。甚至还有Python软件包可以进一步对此进行抽象,从而允许您使用OpenCV和NumPy处理此类数据。我使用了其中一个软件包- pyfakewebcam它具有极其简单的界面。要创建虚拟网络摄像头,只需执行以下操作:



import
      pyfakewebcam
self.camera
    =
    pyfakewebcam.FakeWebcam(self.v4l2_device, 640, 480)


当您收到一个新的帧时,您需要执行以下操作:



self.camera.schedule_frame(output)


现在,在添加少量解码器之后,一切都按预期进行。Zoom可以从VisiTel接收图像,我们可以按照1980年代的风格安排视频聊天。









出于1980年代的精神,视频聊天我还想安装Direct Rendering Manager Linux驱动程序,该驱动程序不仅允许从VisiTel接收图像,而且还可以将其输出到它。但是就目前而言,为了使这个项目成功,我可以使用1988年的设备在Zoom中进行交流。在这里,如果你有兴趣,是在GitHub上的项目代码。



您是否尝试过远古来重生某些设备?










All Articles