From 39d4048dc6fd5a138bd1128c06bccca08fbc72f0 Mon Sep 17 00:00:00 2001 From: 18045010223 <zjbassadmin@> Date: 星期二, 05 八月 2025 08:49:09 +0800 Subject: [PATCH] 解决2019协议设备播放问题 --- src/main/java/cn/org/hentai/jtt1078/util/ByteUtils.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 95 insertions(+), 0 deletions(-) diff --git a/src/main/java/cn/org/hentai/jtt1078/util/ByteUtils.java b/src/main/java/cn/org/hentai/jtt1078/util/ByteUtils.java index 34a4d94..58171bb 100644 --- a/src/main/java/cn/org/hentai/jtt1078/util/ByteUtils.java +++ b/src/main/java/cn/org/hentai/jtt1078/util/ByteUtils.java @@ -1,5 +1,9 @@ package cn.org.hentai.jtt1078.util; +import cn.org.hentai.jtt1078.flv.AudioTag; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + /** * Created by matrixy on 2017/8/22. */ @@ -193,4 +197,95 @@ } return dst; } + + public static String toHexString(byte[] bytes, int offset, int length) { + StringBuilder sb = new StringBuilder(length * 3); + for (int i = offset; i < offset + length && i < bytes.length; i++) { + sb.append(String.format("%02X ", bytes[i])); + } + return sb.toString().trim(); + } + + // 鍙�夛細鎵撳嵃鏁翠釜鏁扮粍 + public static String toHexString(byte[] bytes) { + return toHexString(bytes, 0, bytes.length); + } + + public static int getShort(byte[] bytes, int offset) { + return ((bytes[offset] & 0xFF) << 8) | (bytes[offset + 1] & 0xFF); + } + public static long getLong(byte[] bytes, int offset) { + return ((long)(bytes[offset] & 0xFF) << 56) | + ((long)(bytes[offset + 1] & 0xFF) << 48) | + ((long)(bytes[offset + 2] & 0xFF) << 40) | + ((long)(bytes[offset + 3] & 0xFF) << 32) | + ((long)(bytes[offset + 4] & 0xFF) << 24) | + ((long)(bytes[offset + 5] & 0xFF) << 16) | + ((long)(bytes[offset + 6] & 0xFF) << 8) | + ((long)(bytes[offset + 7] & 0xFF)); + } + + /** + * Flv 闊抽灏佽缂栫爜 + * + * @param audioTag 闊抽tag + * @return 瀛楄妭娴� + * @author xingkong + * @date 2021-09-07 17:02 + */ + public static ByteBuf encode(AudioTag audioTag) throws Exception { + ByteBuf buffer = Unpooled.buffer(); + if (audioTag == null) { + return buffer; + } + //----------------------tag header begin------- + buffer.writeByte(8); + buffer.writeMedium(audioTag.getTagDataSize()); + buffer.writeMedium(audioTag.getOffSetTimestamp() & 0xFFFFFF); + buffer.writeByte(audioTag.getOffSetTimestamp() >> 24); + buffer.writeMedium(audioTag.getStreamId()); + //---------------------tag header length 11--------- + //---------------------tag header end---------------- + byte formatAndRateAndSize = (byte) (audioTag.getFormat() << 4 | audioTag.getRate() << 2 | audioTag.getSize() << 1 | audioTag.getType()); + //-------------data begin------- + buffer.writeByte(formatAndRateAndSize); + buffer.writeBytes(audioTag.getData()); + //-------------data end ------- + //搴旇绛変簬11+tagDataSize + buffer.writeInt(buffer.writerIndex()); + return buffer; + } + + /** + * 璇诲彇bytebuf鍓╀笅鐨勫瓧鑺� + * + * @param msg 鍙鍙朾ytebuf + * @return 鍓╀笅鎵�鏈夌殑瀛楄妭 + * @author xingkong + * @date 2021-09-07 16:15 + */ + public static byte[] readReadableBytes(ByteBuf msg) { + byte[] content = new byte[msg.readableBytes()]; + msg.readBytes(content); + msg.release(); + return content; + } + /** + * 杞崲鏁版嵁 杞崲涓烘垜浠渶瑕佺殑鎶ユ枃褰㈠紡 + * + * @param data 甯﹁浆鎹㈢殑鎶ユ枃 + * @return 杞崲濂界殑鎶ユ枃 + * @author xingkong + * @date 2021/9/8 + */ + public static byte[] make(byte[] data) { + ByteBuf buffer = Unpooled.buffer(); + buffer.writeBytes(String.format("%x\r\n", data.length).getBytes()); + buffer.writeBytes(data); + buffer.writeByte((byte) '\r'); + buffer.writeByte((byte) '\n'); + return readReadableBytes(buffer); + } + + } -- Gitblit v1.9.3