微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

记录带有确切时间戳的音频

如何解决记录带有确切时间戳的音频

我想在Android Wear设备上录制原始音频,并将其与其他传感器数据(例如加速度计)完全同步。 要录制原始音频,我使用AudioRecord,但是如何确定音频流中任何部分的正确时间戳?

基本问题是我从缓冲区中获取原始音频帧,而没有有关这些帧在缓冲区中存在多长时间,丢失了多少帧等信息。

因此要循环获取AudioRecord.read()的帧数据,但是如何知道何时记录了特定帧?

我可以看到三种确定时间戳记的方法,而这些方法在我看来都是错误的:

  1. 通过调用AudioRecord.startRecording()获得在调用SystemClock.elapsedRealtimeNanos()之前或之后的当前系统时间,然后根据采样率和帧大小计算每个块的时间。但是根据我的测试,在实际开始录制之前会有一个明显的延迟。每当某些帧丢失时,例如处理暂停一会儿。

  2. 获取AudioRecord.read()之前或之后的当前系统时间。但这可能不是记录该数据的时间,这可能会更早发生。而且如果没有可用数据,read()将被阻塞,之前获取的时间戳将完全错误

  3. AudioRecord.getTimestamp()给出当前正在录制的帧的时间。但这不一定是我当前正在阅读的帧,我可能落后了几帧,或者可能错过了一些帧。而且根据初步测试,开始后的一段时间内时间戳仅为零。

这将给我留下6个可能错误的时间戳,如下面的代码所示。有没有一个甚至接近准确?

recorder = new AudioRecord(...)

// timeBeforeStart =  SystemClock.elapsedRealtimeNanos()
recorder.startRecording()
// timeAfterStart =  SystemClock.elapsedRealtimeNanos()

...

// timeBeforeRead =  SystemClock.elapsedRealtimeNanos()
// recorder.getTimestamp(frameTimeBeforeRead,AudioTimestamp.TIMEBASE_BOottIME)
recorder.read(myArray,mySize);
// recorder.getTimestamp(frameTimeAfterRead,AudioTimestamp.TIMEBASE_BOottIME)
// timeAfterRead =  SystemClock.elapsedRealtimeNanos()

其中哪些是确定与字节数组中的数据相对应的时间戳的最准确方法

是否有另一种方法获取带有准确时间戳的原始音频数据?

解决方法

您需要创建相关的音频和加速度计信号- 您还可以将手电筒,照相机和扬声器等放入混合器中。

您需要测试哪些演员和传感器具有哪些延迟和抖动,以找到能够关联事件的最佳解决方案(无需使用外部设备),以便计算接收到的音频延迟和抖动。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?