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