我正在尝试从Android的音频输入流中提取SMPTE时间码(维基百科)。
如此处所述 https://stackoverflow.com/a/2099226 第一步是扫描输入流字节序列以查找要同步0011111111111101。但是如何使用录音类来做到这一点?
这个答案并不真正正确。您获得的音频信号是调制载波,从中提取SMPTE位是一个多步骤的过程:您通过麦克风或音频获得的原始数据不会与SMPTE时间码相对应。因此,您需要解码音频,这并不简单。
第一步是从双相标记代码转换音频信号。我自己还没有实现SMPTE阅读器,但是您知道SMPTE标准的时钟速率,所以我要做的第一件事是仔细过滤以消除背景噪音,因为听起来您正在从麦克风中获取音频。消除任何直流偏移的温和高通应该可以,而用于HF噪声的柔和低通也应该有所帮助。(您可以改用宽带通)
然后,您需要找到每个时钟周期的开始时间。你可以做一些花哨的事情,比如自相关或PLL算法,但我怀疑从SMPTE标准中知道近似时钟速率并能够上下调整百分之几就足够了 - 也许更好。因此,只需根据规范寻找重复过渡即可。如果您怀疑您的时间码高度扭曲,做一些花哨的事情会有所帮助(如果您有一个非常旧的磁带卡座,或者您想以非常高/低的速度同步,这可能是这种情况,但 LTC 并不是真正为此而设计的。这更像是VTC的领域。
确定时钟后,您需要确定每个时钟周期是否在时钟周期开始时发生了信号转换。每个时钟周期在中间都有一个转换,但开始时的转换表示 0 位。这就是 BMC 在单个流中传输时钟和数据的方式。这允许您创建实际 SMPTE 数据的新流。
现在,您已将 BMC 解码为 SMPTE 流。下一步是查找同步代码。查看维基百科上的规范以及我对SMPTE的记忆,我会断言找到单个同步代码是不够的,这可能是偶然或巧合发生在80位块的其他地方。相反,您必须以正确的间隔连续查找多个。然后,您可以将数据读入 80 位 SMPTE 块,并且在读取时,您必须继续验证同步代码。如果在预期的位置没有看到搜索,请从头开始搜索。
最后,一旦你解码了,你将不得不想出一些"飞轮"的方法,因为你几乎肯定不会一直正确读取所有数据(没有校验和!这就是野兽的本性。