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