Android如何检测真实录音,MediaRecorder有延迟

9
我希望能够将手机中的数据与录制视频的经过时间同步。我想获取有关录制视频已经经过时间的信息(以毫秒为单位)。我尝试通过以下方式解决:
1. 运行自己的计时器。
伪代码:
mMediaRecorder.start(); //start recording
startTime = System.currentTimeMillis(); //save start recording time
timerHandler.postDelayed(timerRunnable, 0); //for save elapsed time and timerHandler.postDelayed(this, 20); for next 20ms

但是 MediaRecorder 存在问题,因为实际录制不会立即开始,而是有不同的延迟时间(取决于设备等)。我需要“一些”回调或捕获事件来确保 MediaRecorder 真正开始录制。

enter image description here 不需要关注停止录制的信息,因为我可以通过以下方式检查实际视频持续时间:

FileInputStream stream = new FileInputStream(storage.getVideoFile());
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(stream.getFD());
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);

我尝试在录制过程中通过MediaMetadataRetriever获取实际持续时间,但仅适用于已关闭的视频文件。

我尝试通过FileObserver和onEvent进行检测,但这不是很准确。

如果可能的话,我希望通过Android SDK解决。但是怎么做?
[min SDK: API21]

谢谢。


在 mp.start() 返回后立即启动计时器不够好吗? - Doug Stevenson
我正在尝试解决录制而不是播放的问题。当你使用MediaRecorder.start()时,不行,因为在MediaRecorder.start()和实际录制之间在我的设备上有大约700毫秒的时间差。 - t0m
2
你找到解决方案了吗? - kabla002
1个回答

3

我知道你可能已经在这7个月后解决了这个问题,但是......通过查看您发布的图片,您可以使用MediaMetadataRetriever计算出真实的视频长度,然后通过将"a"定义为从Mediarecorder.start()到第一个获得的帧的经过时间,将"b"定义为从最后一个获取的帧到Mediarecorder.stop()的经过时间,并假设a=b,则可以通过以下方式计算开始录制的瞬间:

startTime + a

其中:

a = b = ((stopTime - startTime) - REAL VIDEO LENGTH)/2

startTime = System.nanoTime() (called right after MediaRecorder.start())

stopTime = System.nanoTime() (called right after MediaRecorder.stop())

谢谢。"...假设a=b,你可以通过计算开始记录的时刻来..." 但是a不等于b。 - t0m
1
你找到另一个解决方案了吗? - Alberto Lanaro
我刚刚在几个不同的安卓手机上测试了这种方法,它似乎给出了一个非常接近的近似值。 - user2415486

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接