海康sdk实时音视频流剥离-音频流(一)

883 阅读9分钟

1、需求

公司业务需要对接海康摄像头,获取音视频实时流,将音频流剥离出来,单独发送给其它业务模块,之前仅仅对接海康sdk进行视频抓拍,实时视频播放,故此做了点调研实现该功能,编写该文章记录一下。

2、协议

经过搜索得知,截止本文章编写日期,海康实时音视频流,使用GB28181协议传输,音视频数据用ps封装,实际的音视频数据是存储在一个个pes包内,我用从海康SDK截取的一段实时音视频数据大概说下pes包格式,这里我将字节转换为16进制字符串,两个字符代表一个字节。

000001c0050a8c800721149f6981fff80f00d6ffcbffe3fff5ff16000c0012001c0057003c002900e8ffdbff24005a00680040004d00670070006200610041005e004b001500cbff51ff0cff20ff39ff78ff9dff93ff9affdfff0000e0ffe0ffceffebff1000e1ffceffc4ffb9ffe5fffcff0800dcffd7ffc1ffa5ff5dfffbfeaafe91fedefe12ff56ff82ffb5ffe1fffaff2800140032003900640094007b006f004b0075009b00980075005100300062008c00b500c100b90062001c0017001f004400270036002700b4ffb4ffd9ffeafff5ff0700d5ffd8fffaff36003f003600f4ffc9ffcffffeff1800cfff9aff52ff63ff84ff77ff6aff55ff27ff32ff71ff7cff95ffa3ffa5ffa4ffbafffaff20003c004e000a00cdffb4ffacffb9ffb1ffe5ff4f008d00cd00c200b400b700cb0004012201e700a4006d00300051007900bd00b000d800e400ec0095003900f1ffd3ffb9ff9fff73ff64ff66ff95ffa5ff5eff0ffff0feeefe1bfff3fedefee0feedfeeafe1fff25ff52ff6aff57ff90ffc0fff8ff000014002900190048006d008b007f00a000c900cb009300510040004500540064008d00c000b200c3009c0081007100a600920034000400e1ff15003a0069007e00b700b4007a002a001d001900ecffd0ff6dff38ff3aff7affb6fffeff0300eaffe8ffdeffceffafffa2ffa8ff65ff72ff84ff51ff42ff7cffe6ff64008700910082003100fefffeffd4ffb5ff8fff52ff3dff0aff11ff5bff77ff5fff49ff7fffd3ff22000c0012001b0008001500320048008a00a700a4009b00a100ab00e600f4001c01fa00af007d005d001700b5ff60ff59ff74ffbcffc4ffceffcdffd3ffcaffb2ff84ff43ff6cff9eff6bff3afffdfe21ff83ff0b0020000300cfff1c007f00dc000201e500b300b300da00d600ea00eb00ae0079004e0028002c002a00200011000d00220001001d00330025000100e8ff9cff7aff5cff45ff3bff42ff48ff69ff9dff04003f008600950061003c002900faffb7ff9dffc5ffd0ffa9ffd8ff11006a007e008c0064000500c5ffa4ffaeff0b005c008a00cf00fd000c010c01e500bf00d100d800bc00c600ce00b600ae00a50083007b006c002a00f6ffdeffe9ffdbffc4ffb8ff91ff97ffa2ff75ff67ff37ff2dff5aff5fff92ffbdffb0ffb1ff09003e004d002e00ebffd5ffe2ff09003c001a00f7fffaff130022001400f8fffaff0c002e00320019000200f2ffe5ff0a00fbff0100e7ffefff4800b300db00a6005c0037000a000c00f2ffd4ffccffe9ff070015000800f9ffebffe8ffa0ff3cfff1fedefe1eff3cff60ff48ff19ff0bff2eff92ffabffa9ff5dff42ff25ff3cff5aff70ff9dffc7ffedffdaffe3fff5ff0c001c00f3ffd0ffd1ff15008a00eb000601030123013a01620159013201fd00e600e40012010501ac004d00f3ffc6ffc3ffafffb3ffa6ffcdfffbffc9ff94ff56ff52ff2eff52ff8dffd1ffecfff2ffccffa5ffacfffeff640080004900370051008200b900e300c100b800a400880082004f00460017000400deffb6ff89ff89ff8fff74ff9fffcdffeeff0c001300f0ff00000c007600b500de00bb002900b0ff82ff95ffa3ffb3ffbcffc0ffbfffdfffd7ff87ff39ff29ff73ffc8ff2d0054007e00bc00c400c600a200710038002a0059007500830089004f005b008000e0000c012101dc009800770054001f00bcff53ffedfea3fe87feb2fe00ff50ff49ff22fffcfe02ff33ff4aff79ff89ff97ff9dffabffd9fffaff1300170008001800310068008a0098009500c800fb000301

000001 pes包头 3个字节

c0 Stream ID 1个字节,c0代表音频标识,e0代表视频标识

050a 剩余总长度,2个字节,转换为10进制是1290,也就是说,从这个之后,剩余字节数量是1290个,而我这串数据总共1296个字节

8c80 PTS(Presentation Time Stamp)和DTS(Decoding Time Stamp),2个字节

07 可变长度 1字节,转换为10进制是7,可选的PES头部,包含时间戳、标志位等信息。

21149f69 时间戳,4个字节

81fff8 3个字节

剩余的均是音频数据

3、代码

从海康sdk获取实时音视频流,进入海康官网下载sdk,里面有demo,主要是NET_DVR_RealPlay_V40方法

核心代码如下

 if(dataArray[0] == 0x00 && dataArray[1] == 0x00 && dataArray[2] == 0x01){
		 String streamId = ProtocolUtils.bytesToHexString(new byte[]{dataArray[3]});
     if("c0".equals(streamId)){
//                                System.out.println("音频数据");
                                int length = ((dataArray[4] & 0xFF) << 8) | (dataArray[5] & 0xFF);
//                                System.out.println("长度为:" + length);
                                int changeLength = dataArray[8] & 0xFF;
//                                System.out.println("可变长度:" + changeLength);
                                byte[] audioData = Arrays.copyOfRange(dataArray, (changeLength + 9), dwBufSize);//音频数据
//                                byte[] audioData = pBuffer.getByteArray(changeLength + 9, dwBufSize - (changeLength + 9));
//                                System.out.println("发送长度:" + audioData.length);
                            }
                        }

在多次查看海康音频数据发现,音频数据并没有粘包现象, 每一次发送过来的音频数据都是完整的pes包结构,因此不需要做额外处理,解析完成之后直接转发即可

4、验证

后续我将解析好的音频数据,封装为10秒的wav格式文件,可正常播放,我的海康摄像头音视频设置如下,重点是要将视频类型设置为复合流,这样通过sdk获取到的实时视频流才有音频数据。而音频数据我设置采样率16000,编码格式PCM,便于其它业务处理。

image.png

image.png