【问题标题】:Android: ExoPlayer - Get current frame number from videoAndroid:ExoPlayer - 从视频中获取当前帧号
【发布时间】:2015-11-10 09:35:21
【问题描述】:

我正在开发一个 Android 视频应用程序,我需要在暂停模式下获取正在显示的视频的当前帧 number

我需要向我的服务器发送视频中当前暂停的帧号并返回有关该帧/时间的项目列表,现在我正在发送当前暂停时间(以毫秒为单位),但它不能很好地工作,因为Server根据时间比较发送到特定帧的时间,但有时比较不准确。

我知道,如果您使用 MediaMetaDataRetriever,您可以从该帧中获取位图,我做到了,但它返回位图图像,而我需要的是索引。 我正在使用 ExoPlayer(如果重要的话,我也需要 MP4 和 HLS 的该功能)。

有没有办法从视频中获取这些信息?

【问题讨论】:

  • 其实我很关注
  • 我还需要知道当前帧数而不是毫秒数。如果你计算毫秒到帧,那么你经常会得到一个舍入误差,所以帧是不准确的。

标签: android ffmpeg video-streaming exoplayer


【解决方案1】:

我发布了我的问题的解决方案,为了获得 精确 帧时间,我只是从 ExoPlayer 库中扩展了 MediaCodecVideoTrackRenderer.java 类并使用了函数中的 lastOutputBufferTimestamp 的值:

@Override
protected boolean processOutputBuffer(long positionUs, long elapsedRealtimeUs,
                                      MediaCodec codec, ByteBuffer buffer, MediaCodec.BufferInfo bufferInfo, int bufferIndex,
                                      boolean shouldSkip) {
    boolean processed = super.processOutputBuffer(positionUs, elapsedRealtimeUs, codec, buffer,
            bufferInfo, bufferIndex, shouldSkip);
    if (!shouldSkip && processed) {
        lastOutputBufferTimestamp = bufferInfo.presentationTimeUs;
    }
    return processed;
}

它确实给了我确切的时间,而不是最后说的 mPlayer.getDuration() 或类似的时间。 如果您的视频中有一个恒定的 FPS,您可以通过除法计算得到帧数。 让我知道确切的帧时间就足够了。

我正在使用 ExoPlayer 版本 r1.5.3,所以我不知道此解决方案是否适用于较新版本,因为代码可能已更改。

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多