【问题标题】:Trying to capture a video on Android with timestamps尝试在 Android 上捕获带有时间戳的视频
【发布时间】:2015-02-21 21:58:11
【问题描述】:

我正在尝试实现一个录制视频的 Android 应用程序,同时还编写一个包含每帧拍摄时间的文件。我尝试使用 MediaRecorder,达到了可以保存视频的地步,但我找不到获取时间戳的方法。我尝试做类似的事情:

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

但这似乎不起作用,因为文件长度似乎没有足够频繁地更新(或者我错了吗?)。

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

【问题讨论】:

    标签: android opencv video


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这个问题很老,但我只需要同样的东西。使用 camera2 api,您可以流式传输到多个目标。因此,您可以从一个相同的物理相机流式传输到 MediaRecorder,同时流式传输到 ImageReader。 ImageReader 具有ImageReader.OnImageAvailableListener,您可以使用“onImageAvailable”回调来查询帧的时间戳:

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

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

      编辑:This 看起来每个支持 camera2 的设备都可以流式传输到多达 3 个目标。

      编辑:显然,您可以使用ImageReader 来捕获各个帧及其时间戳,然后使用ImageWriter 将这些图像提供给下游消费者,例如MediaCodec,它会为您录制视频.

      【讨论】:

        【解决方案3】:

        扩展fadden 的答案,最简单的方法是使用MediaRecorder 进行记录(Camera2 example 对我帮助很大)和之后通过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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多