我正在尝试实现一个Android应用程序,它记录一个视频,同时还编写一个文件,其中包含每一帧拍摄的时间。我试着使用MediaRecorder,到了可以保存视频的程度,但我找不到方法来获得时间戳。我试着做了这样的事情:
while (previous video file length != current video file length)
write current time to text file;但这似乎不起作用,因为文件长度似乎更新得不够频繁(或者我错了吗?)
然后我尝试使用OpenCV并设法逐帧捕获图像(因此获得时间戳很容易),但我无法找到将所有帧连接到一个视频的方法。我看到了关于使用NDK和FFmpeg的答案,但我觉得应该有一个更简单的解决方案(也许类似于我在顶部尝试过的解决方案?)
发布于 2014-12-23 18:41:37
您可以使用MediaCodec捕捉视频,但这很快就会变得复杂起来,特别是如果您也想要音频的话。您可以使用MediaExtractor从视频文件中恢复时间戳。只需在每一帧上调用getSampleTime(),以获得以微秒为单位的演示时间。
发布于 2019-07-23 15:28:43
这个问题很老,但我也需要同样的东西。使用camera2 api,您可以流到多个目标。因此,您可以从一个相同的物理相机流到MediaRecorder,同时也可以流到ImageReader。ImageReader有一个ImageReader.OnImageAvailableListener,即"onImageAvailable“回调,您可以使用它查询帧的时间戳:
image = reader.acquireLatestImage();
long cameraTime = image.getTimestamp();但是不确定流到多个目标是否需要某些硬件功能(例如多个图像处理器)。我想,现代设备大概有2-3种。
编辑:这看起来像每一个camera2能力的设备可以流到多达3个目标。
编辑:显然,您可以使用ImageReader来捕获单个帧及其时间戳,然后使用ImageWriter向下游用户提供这些图像,比如MediaCodec,它为您记录视频。
发布于 2020-12-17 17:53:45
扩展fadden的答案,最简单的方法是使用MediaRecorder记录( Camera2实例帮助了我很多),然后通过MediaExtractor提取时间戳。我想添加一个工作的MediaExtractor代码示例:
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(pathToVideo);
do {
long sampleMillis = extractor.getSampleTime() / 1000;
// do something with sampleMillis
}
while (extractor.advance() && extractor.getSampleTime() != -1);https://stackoverflow.com/questions/27625781
复制相似问题