From 3ad25de4feae7a74bc8c2b0ac469129dea6a8da1 Mon Sep 17 00:00:00 2001 From: xiaowusky Date: Wed, 20 Dec 2023 10:18:04 +0800 Subject: [PATCH] =?UTF-8?q?desc:=E7=BC=96=E7=A0=81=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vlc/encoder/MediaCodecManager.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/library-push/src/main/java/com/yinuo/library/vlc/encoder/MediaCodecManager.java b/library-push/src/main/java/com/yinuo/library/vlc/encoder/MediaCodecManager.java index 5ef2931..13e8d52 100644 --- a/library-push/src/main/java/com/yinuo/library/vlc/encoder/MediaCodecManager.java +++ b/library-push/src/main/java/com/yinuo/library/vlc/encoder/MediaCodecManager.java @@ -27,7 +27,7 @@ public class MediaCodecManager { // parameters for the encoder private static final String MIME_TYPE = "video/hevc"; // H.264 Advanced Video // - private ArrayBlockingQueue frameBytes; + private ArrayBlockingQueue frameBytes; private MediaCodec mMediaCodec; private int mColorFormat; private MediaFormat mediaFormat; @@ -149,10 +149,11 @@ public class MediaCodecManager { public void addFrameData(byte[] data) { if (isStart && !isPause) { - boolean isOffer = frameBytes.offer(data); + TimedBuffer timedData = new TimedBuffer(data, System.nanoTime() / 1000); + boolean isOffer = frameBytes.offer(timedData); if (!isOffer) { frameBytes.poll(); - frameBytes.offer(data); + frameBytes.offer(timedData); } } } @@ -208,7 +209,7 @@ public class MediaCodecManager { mMediaCodec.setCallback(new MediaCodec.Callback() { @Override public void onInputBufferAvailable(@NonNull MediaCodec codec, int index) { - byte[] data = null; + TimedBuffer data = null; try { data = frameBytes.take(); } catch (InterruptedException e) { @@ -220,11 +221,11 @@ public class MediaCodecManager { if (inputBuffer == null) return; inputBuffer.clear(); - inputBuffer.put(data); + inputBuffer.put(data.buffer); long currentTimeUs = (System.nanoTime() - mTime) / 1000;//通过控制时间轴,达到暂停录制,继续录制的效果 - codec.queueInputBuffer(index, 0, data.length, currentTimeUs, 0); + codec.queueInputBuffer(index, 0, data.buffer.length, data.time, 0); try { Thread.sleep(0); } catch (InterruptedException e) { @@ -345,4 +346,14 @@ public class MediaCodecManager { return 12; return 11; } + + class TimedBuffer { + byte[] buffer; + long time; + + public TimedBuffer(byte[] data, long frameTime) { + buffer = data; + time = frameTime; + } + } }