在进行编码时,如果将框架提供给MediaMuxer的时间戳(PTS)按递减顺序提供,则会发生该错误。这可能是因为在某些情况下编码器会从多个线程生成帧,因此PTS可能是乱序的。要解决此问题,可以按照以下步骤更改提供给MediaMuxer的PTS,以确保递增顺序:
以下是示例代码,演示如何在使用MediaCodec编码帧并将其写入MediaMuxer时对时间戳进行排序:
private void writeSampleToMuxer(MediaCodec codec, int trackIndex, ByteBuffer encodedData, MediaCodec.BufferInfo bufferInfo, MediaMuxer muxer) {
if (mIsEndOfStream) {
return;
}
assert (Looper.myLooper() == Looper.getMainLooper());
ByteBuffer[] outputBuffers = codec.getOutputBuffers();
if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
codec.releaseOutputBuffer(trackIndex, false);
return;
}
if (bufferInfo.size == 0) {
return;
}
int outBufferIndex = muxer.addTrack(codec.getOutputFormat());
if (mTrackMap.get(trackIndex) == null) {
mTrackMap.put(trackIndex, outBufferIndex);
muxer.start();
}
// Store timestamp and buffer in a FIFO buffer.
TimestampedBuffer outputFrame = new TimestampedBuffer(bufferInfo.presentationTimeUs, ByteBuffer.allocate(bufferInfo.size));
outputFrame.buffer.put(encodedData);
mBufferQueue.offer(outputFrame);
// Reorder the FIFO buffer by the timestamp.
ArrayList sorted