心血来潮,编码时想自己计算一下码率和帧率
核心点:
- 利用现有的固定帧率mFrameRate,计算两个buffer时间间隔内 elapsedUs,处理了多少帧 tempFrameCount,然后除以elapsedUs,得到一个动态的帧率
- 将当前视频帧 乘以8 ,换算为比特数,然后除以时间间隔:elapsedUs
public void encodeFrame(byte[] input) {
if (mEncoder == null) {
return;
}
int inputBufferIndex = mEncoder.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = mEncoder.getInputBuffer(inputBufferIndex);
inputBuffer.clear();
inputBuffer.put(input);
mEncoder.queueInputBuffer(inputBufferIndex, 0, input.length, mPresentationTimeUs, 0);
mPresentationTimeUs += 1000000L / mFrameRate;
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mEncoder.dequeueOutputBuffer(bufferInfo, 0);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = mEncoder.getOutputBuffer(outputBufferIndex);
if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
bufferInfo.size = 0;
}
if (bufferInfo.size != 0) {
if (!mMuxerStarted) {
throw new RuntimeException("muxer hasn't started");
}
long presentationTimeUs = bufferInfo.presentationTimeUs;
long elapsedUs = presentationTimeUs - mPresentationTimeUs;
if (elapsedUs >= 1000000L) {
long outputSize = bufferInfo.size + mPrevOutputSize;
int frameRate = (int) (1000000L * mFrameRate * (elapsedUs / 1000000L)) / (int) elapsedUs;
int bitrate = (int) (8 * outputSize * 1000000L / elapsedUs);
Log.d("VideoEncoder", "Frame rate: " + frameRate + ", Bitrate: " + bitrate);
mPrevPresentationTimeUs = presentationTimeUs;
mPrevOutputSize = 0;
}
mPrevOutputSize += bufferInfo.size;
}
mEncoder.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = mEncoder.dequeueOutputBuffer(bufferInfo, 0);
}
}
}