Android:ExoPlayer - 从视频中获取当前帧编号

Gil*_*Gil 6 android ffmpeg video-streaming exoplayer

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

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

我知道如果你使用MediaMetaDataRetriever,你可以从该帧获得一个位图,我做了它,但它返回位图图像,我需要的是一个索引.我正在使用ExoPlayer(我需要MP4和HLS的功能,如果这很重要).

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

Gil*_*Gil 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;
}
Run Code Online (Sandbox Code Playgroud)

它确实给了我准确的时间,而不是最后说的 mPlayer.getDuration() 或类似的时间的舍入时间。如果视频中的 FPS 恒定,您可以通过除法计算并获取帧数。对我来说,知道确切的帧时间就足够了。

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