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; + } + } }