GB28181设备接入端如何播放语音广播数据?

简介: GB28181设备接入端如何播放语音广播数据?

 技术背景

语音广播功能是GB28181设备接入端非常重要的功能属性,语音广播让终端和平台之间,有了实时双向互动,可以满足执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终端等场景的技术诉求。

这里我们先回顾下GB28181规范关于语音广播的描述:

语音广播功能实现用户通过语音输入设备向前端语音输出设备的语音广播。

语音输入设备/语音输入联网系统(以下简称“语音流发送者”)、SIP 服务器向语音输出设备/语音输出视频监控联网系统(以下简称“语音流接收者”)发送通知消息,语音流接收者收到通知消息后,进行判断处理。

若能够接收广播,则向语音流发送者发起呼叫请求,获取广播媒体流。

语音输入设备、语音输出设备编码应符合E.1 的规定。如果设备具备语音输出能力,则在设备目录查询和订阅时,需要上报语音输出设备。如果不上报语音输出设备,则表示该设备没有语音输出能力。

上报语音输出通道时,ParentID 填写其父设备的 ID。例如,IPC 具备语音输出能力,在 IPC 上报设备目录时,需要上报语音输出设备。该语音输出设备ID的类型编码为 137,其父设备为该IPC。NVR 本身具备语音输出能力,在 NVR 上报设备目录时,除了上报 NVR 接入的 IPC 以及IPC 自身的语音输出设备之外,还需要上报语音输出设备。该语音输出设备ID的类型编码为137.其父设备为该NVR。监控中心与设备之间进行语音广播,可以直接对语音输出设备发送语音广播通知,也可以对语音输出设备所属的前端主设备发送语音广播通知。

对前端主设备发送语音广播通知消息中仅需携带前端主设备编码,表示对该设备上所有的语音输出设备进行语音广播。例如,对IPC 发送语音广播通知,表示对该IPC 接入的所有语音输出设备进行广播;对 NVR 发送语音广播通知,表示对 NVR 下所有 IPC以及自身的语音输出设备进行广播。

语音流的封装格式应符合 C.2.4 音频流的 RTP 封装的定义。

语音广播宜符合附录 K 规定的媒体流保活机制。

技术实现

本文我们不再探讨GB28181语音广播的具体流程,这里我们假定信令交互已经完成,准备接收数据:

camera2解锁图像方向.jpg

收到broadcast语音广播后,我们的处理逻辑如下:

privatebooleanstartAudioPlay() {
if (player_handle_!=0 )
returnfalse;
player_handle_=lib_player_.SmartPlayerOpen(context_);
if (player_handle_==0)
returnfalse;
lib_player_.SetSmartPlayerEventCallbackV2(player_handle_,newEventHandlerPlayerV2());
// 缓存大小可以调整lib_player_.SmartPlayerSetBuffer(player_handle_, 0);
// lib_player_.SmartPlayerSetFastStartup(player_handle_, 0);// set report download speed(默认2秒一次回调 用户可自行调整report间隔)lib_player_.SmartPlayerSetReportDownloadSpeed(player_handle_, 1, 2);
lib_player_.SmartPlayerClearRtpReceivers(player_handle_);
lib_player_.SmartPlayerAddRtpReceiver(player_handle_, rtp_receiver_handle_);
lib_player_.SmartPlayerSetSurface(player_handle_, null);
lib_player_.SmartPlayerSetAudioOutputType(player_handle_, 1);
lib_player_.SmartPlayerSetMute(player_handle_, 0);
lib_player_.SmartPlayerSetAudioVolume(player_handle_, 100);
lib_player_.SmartPlayerSetExternalAudioOutput(player_handle_, newPlayerExternalPCMOutput());
lib_player_.SmartPlayerSetUrl(player_handle_, "rtp://ntinternal/rtpreceiver/implemention0");
if (0!=lib_player_.SmartPlayerStartPlay(player_handle_)) {
lib_player_.SmartPlayerClose(player_handle_);
player_handle_=0;
Log.e(TAG,  "[daniusdk]start audio play failed");
returnfalse;
  }
lib_player_.SmartPlayerSetAudioDataCallback(player_handle_, newPlayerAudioDataOutput());
lib_player_.SmartPlayerSetPullStreamAudioTranscodeAAC(player_handle_, 0);
if (0==lib_player_.SmartPlayerStartPullStream(player_handle_) ) {
// 启动定时器,长时间收不到音频数据,则停止播放,发送BYElast_received_audio_data_time_.set(SystemClock.elapsedRealtime());
handler_.postDelayed(newAudioPlayerPCMTimer(player_handle_), AudioPlayerPCMTimer.INTERVAL_MS);
  }
returntrue;
}

image.gif

简单来说,就是启动了个纯语音播放的实例,来处理过来的PCMA或PS的audio数据。

其中PlayerExternalPCMOutput()主要是把数据塞到GB28181数据采集处理的模块,来实现语音广播的回音消除的目的。

classPlayerExternalPCMOutputimplementsNTExternalAudioOutput {
privateintbuffer_size_=0;
privateByteBufferpcm_buffer_=null;
@OverridepublicByteBuffergetPcmByteBuffer(intsize)  {
//Log.i("getPcmByteBuffer", "size: " + size);if(size<1)
returnnull;
if(buffer_size_!=size) {
buffer_size_=size;
pcm_buffer_=ByteBuffer.allocateDirect(buffer_size_);
    }
returnpcm_buffer_;
  }
publicvoidonGetPcmFrame(intret, intsampleRate, intchannel, intsampleSize, intis_low_latency) {
if (null==pcm_buffer_)
return;
pcm_buffer_.rewind();
if (ret==0&&isGB28181StreamRunning&&publisherHandle!=0 )
libPublisher.SmartPublisherOnFarEndPCMData(publisherHandle, pcm_buffer_, sampleRate, channel, sampleSize, is_low_latency);
  }
}

image.gif

如果需要停止播放,调用以下逻辑即可:

privatevoidstopAudioPlayer() {
if (player_handle_!=0 ) {
lib_player_.SmartPlayerStopPullStream(player_handle_);
lib_player_.SmartPlayerStopPlay(player_handle_);
lib_player_.SmartPlayerClose(player_handle_);
player_handle_=0;
  }
}

image.gif

总结

GB28181语音广播这块,如果平台侧和终端,都是按照规范来实现的话,问题会少很多,实际尴尬的是,大厂或部分厂商先入为主,实际生产环境,不一定按照预期的,谁的问题谁处理,作为Android终端模块,push不动国标平台侧的时候,有时候只有兼容它,这种痛苦真是一言难尽。

相关文章
|
XML 网络协议 Android开发
GB28181设备接入端如何实现校时?
在探讨这个问题之前,我们先看看GB/T28181-2016官方文档怎么说的,9.10.1章节校时基本要求提到: 联网内设备支持基于SIP方式或 NTP方式的网络校时功能,标准时间为北京时间。
683 1
|
Ubuntu
Ubuntu Server 20.04 LTS下载及安装教程
Ubuntu Server 20.04 LTS下载及安装教程
7342 0
Ubuntu Server 20.04 LTS下载及安装教程
|
JSON Kubernetes 算法
Cobra 命令自动补全指北
本篇文章就来讲讲如何使用 Cobra 来实现命令自动补全。
4441 0
|
NoSQL Linux Redis
Linux系统中安装redis+redis后台启动+常见相关配置
Linux系统中安装redis+redis后台启动+常见相关配置
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
946 2
|
存储 人工智能 Prometheus
剑指大规模 AI 可观测,阿里云 Prometheus 2.0 应运而生
本文介绍了阿里云Prometheus 2.0方案,针对大规模AI系统的可观测性挑战进行全面升级。内容涵盖数据采集、存储、计算、查询及生态整合等维度。 Prometheus 2.0引入自研LoongCollector实现多模态数据采集,采用全新时序存储引擎提升性能,并支持RecordingRule与ScheduleSQL预聚合计算。查询阶段提供跨区域、跨账号的统一查询能力,结合PromQL与SPL语言增强分析功能。此外,该方案已成功应用于阿里云内部AI系统,如百炼、通义千问等大模型全链路监控。未来,阿里云将发布云监控2.0产品,进一步完善智能观测技术栈。
1637 42
|
Ubuntu 开发工具
Ubuntu 22.04 aarch64版本操作系统下编译ZLMediaKit教程
通过上述步骤,你可以在Ubuntu 22.04 aarch64版本上成功编译ZLMediaKit,这是一个相对简单而直接的过程,但可能会遇到一些需要根据具体系统环境和要求调整的地方。
1399 0
|
存储 人工智能 自然语言处理
NoteGen:看看使用DeepSeek能力的开源项目有多牛,平替TyporaAI笔记应用
NoteGen 是一款基于 Tauri 开发的跨端 AI 笔记应用,支持 Mac、Windows 和 Linux。它利用多种 AI 模型(如 ChatGPT、DeepSeek 等)帮助用户高效记录、整理和创作。核心功能包括截图识别、文本记录、插图插入、智能标签管理及剪贴板识别。NoteGen 还提供强大的 Markdown 编辑器、AI 辅助写作、文件同步与版本控制等功能,极大提升了知识管理效率。项目开源,平替 Typora AI 笔记应用。
1668 11
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
1281 10
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
Linux
如何让linux显示器命令行界面不显示
若需在命令行界面快速关闭屏幕,可选方法包括:使用`setterm --blank force`立即关闭屏幕;利用`sudo vbetool dpms off`将显示器置于低功耗模式;在X server环境下执行`xset dpms force off`关闭屏幕;或是针对笔记本通过`echo 0 | sudo tee /sys/class/backlight/*/brightness`关闭背光。以上任一方法均可实现屏幕关闭,部分操作需要管理员权限,屏幕通常会在按键或移动鼠标后自动恢复。
3541 9

热门文章

最新文章