尝试使用时间戳在Android上捕获视频

时间:2014-12-23 18:09:33

标签: android opencv video

我正在尝试实现一个记录视频的Android应用,同时还要编写一个包含每个帧拍摄时间的文件。我尝试使用MediaRecorder,达到了可以保存视频的程度,但我无法找到获取时间戳的方法。我尝试过这样的事情:

while (previous video file length != current video file length)
    write current time to text file;

但这似乎不起作用,因为文件长度似乎没有经常更新(或者我错了?)。

然后我尝试使用OpenCV并设法逐帧捕获图像(因此获取时间戳很容易),但我找不到将所有帧连接到一个视频的方法。我看到了使用NDK和FFmpeg的答案,但我觉得应该有一个更简单的解决方案(也许类似于我在顶部试过的那个?)。

3 个答案:

答案 0 :(得分:1)

您可以使用MediaCodec来捕捉视频,但这很快就会变得复杂,尤其是如果您还需要音频的话。您可以通过MediaExtractor遍历视频文件来恢复时间戳。只需在每个帧上调用getSampleTime()即可获得以微秒为单位的演示时间。

答案 1 :(得分:1)

这个问题很旧,但是我只需要同样的事情。使用camera2 API,您可以流式传输到多个目标。因此,您可以从一台和同一台物理摄像机流式传输到MediaRecorder,同时流到ImageReader。 ImageReader具有ImageReader.OnImageAvailableListener,即“ onImageAvailable”回调,可用于查询帧的时间戳:

image = reader.acquireLatestImage();
long cameraTime = image.getTimestamp();

尽管不确定流传输到多个目标是否需要某些硬件功能(例如,多个图像处理器)。我猜,现代设备中只有2-3种。

编辑:This似乎每个具有camera2功能的设备都可以流式传输多达3个目标。

答案 2 :(得分:1)

扩展fadden的答案,最简单的方法是使用MediaRecorderCamera2 example帮了我大忙)和之后通过{{3 }}。我想添加一个有效的MediaExtractor代码示例:

MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(pathToVideo);
do {
    long sampleMillis = extractor.getSampleTime() / 1000;
    // do something with sampleMillis
}
while (extractor.advance() && extractor.getSampleTime() != -1);