在android中读取原始音频并提取SMPTE时间码

在android中读取原始音频并提取SMPTE时间码,android,audio,input,stream,Android,Audio,Input,Stream,我试图从android中的音频输入流中提取SMPTE时间码() 如本文所述,第一步是扫描0011111101的输入流字节序列以进行同步。但是如何在录音课上做到这一点呢?这个答案并不正确。您获得的音频信号是一个调制载波,从中提取SMPTE位是一个多步骤的过程:您通过麦克风或音频输入获得的原始数据不会对应于SMPTE时间码。因此,您需要解码音频,这一点都不简单 第一步是转换音频信号。我自己还没有实现SMPTE阅读器,但是你知道SMPTE标准中的时钟频率,所以我要做的第一件事是仔细过滤以去除背景噪声,

我试图从android中的音频输入流中提取SMPTE时间码()


如本文所述,第一步是扫描0011111101的输入流字节序列以进行同步。但是如何在录音课上做到这一点呢?

这个答案并不正确。您获得的音频信号是一个调制载波,从中提取SMPTE位是一个多步骤的过程:您通过麦克风或音频输入获得的原始数据不会对应于SMPTE时间码。因此,您需要解码音频,这一点都不简单

第一步是转换音频信号。我自己还没有实现SMPTE阅读器,但是你知道SMPTE标准中的时钟频率,所以我要做的第一件事是仔细过滤以去除背景噪声,因为听起来你好像是从麦克风接收音频。一个温和的高通消除任何直流偏移应该做,一个温和的低通高频噪声也应该有所帮助。(您可以使用宽带通)

然后,您需要找到每个时钟周期的开始。你可以做一些奇特的事情,比如自相关或PLL算法,但我怀疑从SMPTE标准中知道近似的时钟频率,并且能够上下调整几个百分点就足够了——也许更好。因此,只需根据规范寻找重复转换。如果您怀疑您的时间码高度扭曲(如果您有一个非常旧的磁带组,或者您希望以非常高/低的速度同步,可能会出现这种情况,但LTC并不是专门为此设计的。这更多是VTC的领域)

一旦确定了时钟,就需要为每个时钟滴答声确定信号是否在时钟周期开始时发生转换。每个时钟滴答在中间会有一个过渡,但是在开始时的一个转变表示一个0位。这就是BMC在单个流中传输时钟和数据的方式。这允许您创建实际SMPTE数据的新流

现在,您已经将BMC解码为SMPTE流。下一步是查找同步代码。看看维基百科上的规范,从我对SMPTE的记忆中,我可以断言,仅仅找到一个同步代码是不够的,它可能在80位块的其他地方意外或巧合地发生。相反,您必须以正确的间隔在一行中找到几个。然后,您可以将数据读入80位SMPTE块,并且在读取时,必须继续验证同步代码。如果您没有看到您期望的结果,请从头开始搜索


最后,一旦你解码了,你就必须想出一些“飞轮”的方法,因为你几乎肯定不会一直正确读取所有数据(没有校验和!)。这就是野兽的本性。

哇,谢谢你的回答。您认为libsmpte()是否包含用于解调的函数?你知道有什么Java库可能会有帮助吗?我可能是误读了,但根据这个,这个库看起来是为做你想做的事情而设计的。恐怕我不知道有什么Java库可以帮助您,但您可能会发现,您可以搜索双相标记代码或相关术语,然后在此基础上编写自己的SMPTE阅读器。