Android检测真实录制,MediaRecorder延迟

时间:2016-02-13 23:39:09

标签: android android-mediarecorder video-recording

我想将手机中的数据与经过时间录制视频同步。我想获得有关录制视频的已用时间的信息(以ms为单位)。我尝试通过以下方式解决它:
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.start()之后开始,但真正的视频录制有不同的延迟(取决于设备,......)。我需要"一些" 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]

谢谢。

1 个答案:

答案 0 :(得分:1)

我知道你可能在这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())