6

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

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

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

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

4

1 回答 1

2

我发布了我的问题的解决方案,为了获得确切的帧时间,我只是从 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-04-28T06:38:27.520 回答