[英]record audio with exact timestamps
我想在 android 穿戴設備上錄制原始音頻,並將其與其他傳感器數據(例如加速度計)精確同步。 要錄制原始音頻,我使用AudioRecord
,但如何確定音頻 stream 任何部分的正確時間戳?
基本問題是我從緩沖區獲取原始音頻幀,沒有關於這些幀在緩沖區中的時間、丟失了多少幀等的信息。
因此,為了獲取幀數據,我在循環中調用AudioRecord.read()
,但我如何判斷特定幀的錄制時間?
我可以看到三種確定時間戳的方法,在我看來,所有這些方法都是錯誤的:
通過調用SystemClock.elapsedRealtimeNanos()
獲取調用AudioRecord.startRecording()
之前或之后的當前系統時間,然后根據采樣率和幀大小計算每個塊的時間。 但是根據我的測試,在錄制實際開始之前,會有很大的延遲。 每當某些幀丟失時,時間也會不同步,例如,當處理暫停片刻時。
在AudioRecord.read()
之前或之后獲取當前系統時間。 但這可能不是記錄這些數據的時間,那可能發生得更早一些。 如果還沒有可用的數據,read() 將阻塞並且之前獲取的時間戳將完全錯誤。
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, 0, mySize);
// recorder.getTimestamp(frameTimeAfterRead, AudioTimestamp.TIMEBASE_BOOTTIME)
// timeAfterRead = SystemClock.elapsedRealtimeNanos()
其中哪一個是確定與字節數組中的數據對應的時間戳的最准確方法?
是否有不同的方法來檢索具有准確時間戳的原始音頻數據?
您需要創建一個相關的音頻和加速度計信號 - 您可能還會將手電筒、相機和揚聲器等放入混合中。
您需要測試哪些參與者和傳感器具有哪些延遲和抖動,以找到能夠關聯事件以計算接收到的音頻延遲和抖動的最佳解決方案(不使用外部設備)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.