【问题标题】:Read raw audio and extract SMPTE timecode in android在android中读取原始音频并提取SMPTE时间码
【发布时间】:2012-07-02 21:24:22
【问题描述】:

我正在尝试从 android 的音频输入流中提取 SMPTE 时间码 (wikipedia)。

这里提到https://stackoverflow.com/a/2099226第一步是扫描输入流字节序列中的0011111111111101进行同步。但是如何使用 AudioRecord 类来做到这一点?

【问题讨论】:

    标签: android audio input stream


    【解决方案1】:

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

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

    然后,您需要找到每个时钟周期的开始。你可以做一些花哨的事情,比如自相关或 PLL 算法,但我怀疑从 SMPTE 标准中了解近似时钟速率并能够上下调整几个百分点就足够了——也许更好。因此,只需根据规范寻找重复的过渡。如果您怀疑您的时间码高度扭曲,那么做一些花哨的事情会有所帮助(如果您有一个非常旧的磁带卡座,或者您想以非常高/低的速度同步,可能就是这种情况,但 LTC 并不是真正为此而设计的。那是更多 VTC 的域名。)。

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

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

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

    【讨论】:

    • 哇,感谢这个澄清的答案。您认为 libsmpte (ltcsmpte.svn.sourceforge.net/svnroot/ltcsmpte/libltcsmpte/trunk) 是否包含解调功能?你知道任何可能有帮助的 Java 库吗?
    • 我可能误读了,但根据 ltcsmpte.sourceforge.net 的说法,该库旨在满足您的需求。恐怕我不知道任何 Java 库可以帮助您,但您可能会发现一些东西是您搜索双相标记代码或相关术语,然后在此基础上编写您自己的 SMPTE 阅读器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多