Android MediaCodec录屏时如何获取实时的时长
时间: 2023-12-10 19:39:11 浏览: 99
android录屏源码,可二次开发
在使用Android MediaCodec录屏时,可以使用MediaCodec的`dequeueOutputBuffer`方法获取每个输出缓冲区的信息,包括时间戳和时长。时间戳可以通过`BufferInfo.presentationTimeUs`获取,时长可以通过`BufferInfo.flags`和`BufferInfo.size`计算得出。
具体来说,可以在`dequeueOutputBuffer`方法中获取输出缓冲区的信息,然后计算每帧的时长,并累加得到当前的总时长。示例代码如下:
```
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
while (true) {
int outputBufferId = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
if (outputBufferId >= 0) {
// 计算每帧的时长
long presentationTimeUs = bufferInfo.presentationTimeUs;
long frameDurationUs = bufferInfo.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME ?
keyFrameDurationUs : frameDurationUs;
long frameDurationMs = frameDurationUs / 1000;
// 累加得到当前的总时长
long currentTimeMs = (presentationTimeUs - startPresentationTimeUs) / 1000;
videoDurationMs = Math.max(videoDurationMs, currentTimeMs + frameDurationMs);
mediaCodec.releaseOutputBuffer(outputBufferId, true);
if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
break;
}
} else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
// 处理输出格式变更
MediaFormat mediaFormat = mediaCodec.getOutputFormat();
int width = mediaFormat.getInteger(MediaFormat.KEY_WIDTH);
int height = mediaFormat.getInteger(MediaFormat.KEY_HEIGHT);
int frameRate = mediaFormat.getInteger(MediaFormat.KEY_FRAME_RATE);
int iFrameInterval = mediaFormat.getInteger(MediaFormat.KEY_I_FRAME_INTERVAL);
keyFrameDurationUs = iFrameInterval * 1000 * 1000 / frameRate;
frameDurationUs = 1000 * 1000 / frameRate;
} else if (outputBufferId == MediaCodec.INFO_TRY_AGAIN_LATER) {
// 等待下一帧输出缓冲区
break;
}
}
```
其中,`startPresentationTimeUs`是录制开始的时间戳,`keyFrameDurationUs`是关键帧的时长,`frameDurationUs`是普通帧的时长。在`INFO_OUTPUT_FORMAT_CHANGED`回调中,可以获取输出视频的宽度、高度、帧率等信息,并计算出关键帧和普通帧的时长。在每个输出缓冲区处理完成后,如果标记为结束,则退出循环。如果下一帧输出缓冲区还未准备好,则等待并继续获取下一个输出缓冲区。
阅读全文