我正在开发一个Android视频应用,我需要在暂停模式下显示正在显示的视频的当前帧数字。
我需要向我的服务器发送当前在视频中暂停的帧编号并返回有关该帧/时间的项目列表,现在我发送当前暂停时间(以毫秒为单位),但它没有' t工作得很好,因为服务器根据时间比较发送到它计算的特定帧的时间,但有时比较不准确。
我知道如果你使用 MediaMetaDataRetriever ,你可以从该帧获得一个位图,我做了但它返回了位图图像,我需要的是一个索引。 我使用ExoPlayer(我需要MP4和HLS的功能,如果这很重要的话)。
有没有办法从视频中获取该信息?
答案 0 :(得分: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,因此我不知道此解决方案是否适用于较新版本,因为代码可能已更改。