音频CD之前有生命吗?PCM软件解码器

上一篇文章中,我们讨论了记录在VHS磁带上的动态QR码。PCM流行病也吸引了我,因此现在该选择这种格式了。

用PCM处理器捕获

在第一阶段,我们将尝试实现软件解码器。这不是关于该主题的最后一篇文章,因为在日本的拍卖中,处理器可能会结束,PCM应该出现在每个家庭中!查找视频播放器不是问题。

要工作,您需要一个包含这些相同QR码的文件。您可以使用视频捕获卡获取它。好吧,信号源,当然。您可以直接捕获处理器输出或在磁带录音机上记录。理想情况下,立即与捕获设备一起实时解码信号。

任何语言都可以。我从Python开始。但是事实证明,在我的笔记本电脑上,它运行起来很慢,因此,我切换到了C ++。顺便说一下,我们的小社区(几乎彼此独立)正在开发3个解码器项目:在OpenCV(C ++),Qt(C ++)和LabView上。将讨论第一个。之所以选择OpenCV,是因为使用捕获设备和预先录制的视频都非常简单。另外,对图像的所有操作都得到了高度优化。

您将遇到的第一个问题是数据丢失。在任何情况下,如果没有“专用”设备,它们将以任何方式避免。 PCM使用的线条多于适合框架可视区域的线条。在NTSC区域的情况下,此数字为每帧492行,可见区域为480.在PAL的情况下,一切都更加糟糕。
1. PCM NTSC 44,056 kHz, PAL 44,1 kHz.
2. VHS . ( ). , . , . , . .
有两个解决方案。以一种棘手的方式使用捕获卡,绕过驱动器并从ADC那里获取数据,然后可以将它们转换为完整的PCM帧,或者在丢失的行上敲击。第二个选项听起来有些疯狂,但是数据存储格式允许您恢复部分数据。对于NTSC区域,事实证明它满足纠错系统的限制。

由于使用了服务线路,因此您不能带复合输出的视频卡来播放PCM处理器。如果Iron在特定行中找不到标题,它将忽略整个框架。关于这个主题有一些想法,但是稍后会以某种方式出现。

首先,视频信号是隔行扫描的。每帧包含两个,由奇数行和偶数行组成。它们称为字段。 PCM处理器在这些字段中起作用。因此,我们还需要拆分原始流。在此之前,最好将黑白(灰度)图像转换为二进制图像,以便更轻松地工作。

至此,我们遇到了与视频捕获设备功能相关的三个困难。您不能使用静态阈值对图像进行二值化。但是OpenCV本身解决了这个问题,借助它,我们可以用一条魔术线获得相当不错的结果。

threshold(greyFrame, fullFrame, 0, 255, THRESH_BINARY + THRESH_OTSU);

第二个问题是颜色。 PCM处理器不使用视频信号的颜色分量,但是捕获卡可能会尝试从噪声中提取出来。在最便宜的EasyCAP上尤其明显。这会稍微破坏二值化的结果,因此首先需要将图像转换为灰色阴影。

cvtColor(srcFrame, greyFrame, CV_BGR2GRAY);

除上述内容外,EasyCAP还会使位置中的字段混乱。更准确地说,它跳过了第一行,因此所有其他行都没有就位。对于从幼儿园录制短片来说,这不是很重要,但是在这里已经成为一个问题。以正确的顺序排列行很容易。在每一帧的末尾都有一个没有数据的区域。如果我们将包含有用信号的行向下移动到停止位置,则可以保证这些字段将返回其位置。在研究时,我尝试使用三种价格不同的捕获设备,但最终最有用的却是最便宜的,因为它揭示了许多问题。

从录像带捕获EasyCAP

与在Magewell Pro Capture AIO上捕获的文章的第一个插图相比,可以在图像中观察到色点和更高级别的数据位亮度。

现在该记住信号存储在什么位置上了。 VHS录音机的特殊质量没有差异,因为它是家用格式。仅帧和行同步脉冲不足以稳定工作。因此,附加的同步标记被添加到视频信号。在每行的开头都有一个交替的两个白色和两个黑色“像素”的序列,并且在行的结尾有一个具有最大亮度的小区域,用于调整AGC。数据位本身的亮度为1的最大值的60%,小于0的20%的亮度。这是为什么需要这些标签的一个示例:在帧的开头和结尾将图像从盒式录像带反转。

帧开始时出现扭曲

根据同步标记,每行中都有一个数据区域。接下来,您需要确定位宽度(每行仅128位)并将图像行缩小到16个字节。

让我们仔细看看数据格式。该行由8个14位的块组成,每个块包含用于输出到DAC(样本)和纠错码的值,以及一个带有校验和的块(CRC-16 / CCITT-FALSE)。通过校验和确定掉线,设备将尝试在其中恢复数据。每行包含左右声道的三个样本,一个奇偶校验块P(所有样本的异或)和一个神秘的Q。顺序如下:L0,R0,L1,R1,L2,R2,P,Q。今天,无法进行Q校正由于尚未完全理解该材料,因此我们将进行调试。

行中的数据顺序

如果使用“原样”,则虚线表示一次丢失了三个样本,这在金属环上的耳朵中会很明显。但是,dida更聪明,决定用梯子记录数据。一行仅取一个块。下一拍略有偏移。楼梯的台阶有16条线。 L0块取自1行。具有行17的块R0 ...因此,使用奇偶校验块,您可以从连续丢失的16行中恢复数据。但前提是梯子内部有一个错误。 Q块可让您修复两个错误,最多可恢复32条丢失的行。

图片

考虑一个简单的例子。PCM帧中有一个片段,其中几行折断(以红色突出显示)。前4个梯子正常处理。第五个将捕获虚线。Q块首先丢失,但由于它可以纠正错误,并且样本本身也没有损坏,因此可以继续进行。对于第六梯子,我们执行相同的操作。然后又有多达21个未损坏的梯形图,其中的块P受其影响,它还用于恢复数据。您可以跳过。因此,我们进入了37个台阶,其中正确通道的样本将被损坏。要还原它,您需要对奇偶校验块和所有其他样本执行XOR:

R2=L0R0L1R1L2P


结果,我们得到了初始值。如果有两个错误,则尝试使用Q块进行恢复。如果有更多错误,则除了插值被打样的样本的值或将其重置之外,将无济于事。

可以在一个小的GIF动画中观察到通过场的过程。

图片

因此,我们一直进行到梯子的最后一步停在田野尽头为止。硬件PCM具有循环缓冲区。一旦处理完该行,就可以用新数据填充它。因此,最后一步跳了而没有中断播放。

我选择了稍微不同的工作原理。现在不再有这样的内存限制,因此缓冲区的大小略大:字段的高度加上梯子的高度。一旦梯形图到达缓冲区的末尾,最后的111行将被传输到开头,并且已经从112行开始填充新数据。当然,我们一定不能忘记,使用采集卡时,我们会失去一些优势。因此,请确保在缺失的行中填充零,以便将其标记为可通过CRC错误进一步恢复。

PCM最初是14位。但是随着时间的流逝,当VHS录像机提高图像质量时,制造商切换到16位,而不会忘记向后兼容性。
3. 14- PCM 12 . ( ).
在16位PCM中,根本没有Q块,因此在字段标题“不可能进行Q校正”中有一个特殊标记。取而代之的是,收集了2个样本和P的缺失位,在这种情况下,梯形的高度不是8步,而是7,因为该块的缺失位存储在自己的行中,而不是分开存储。以捕获频率为100 Hz和最大幅度的曲折为例,了解16位PCM的工作原理非常简单。一切立即就位。

14位和16位PCM的比较

现在是时候将结果保存到wav文件中了。 libsndfile库将对此提供帮助。虽然... PCM不会保存文件,但会立即播放。在这里,您可以记住有关管道之类的很棒的事情。一个程序的输出输入到另一个程序时。我们只需将stdout指定为目标,然后将流重定向到ffplay程序。

./ggg -i easycap.avi -o - | ffplay -

现在,您可以欣赏这些drop并继续调试代码以摆脱掉它们

您可以从GitHub上的页面下载解码器源:https : //github.com/walhi/pcm还有一个发电机。总有一天,我会将其设计为foobar的插件...

正在进行一些积极的工作,以完成对Q块的恢复,因此,对于或多或少的正确工作,您将不得不跳过提交。但是这些都是琐事。那些想玩的人可以下载捕捉示例

All Articles