海康SDK/Ehome/RTSP/GB28181协议安防视频云服务EasyCVR能够通过GB28181协议进行级联,假如摄像头或设备支持音频的话,EasyCVR同样也能够进行音频采集。
EasyCVR添加一个本地流通道,把音频勾选上,在浏览器视频广场播放,浏览器一直出现相同错误,并没有声音输出:“[MSEController] > Failed to execute ‘appendBuffer’ on ‘SourceBuffer’: The HTMLMediaElement.error attribute is not null.”
浏览器启动播放流程序,打印的信息如下:
里面有个RTMP流,这个是往nginx服务端进行推送的流,把原始的RTMP流使用VLC进行播放,出现信息:
此H264视频是可以进行解析的,但是aac音频解析不出来,才导致无法播放。
使用c EasyStreamClient程序,通过修改指令参数,把RTSP往nginx服务端上推流,在使用VLC进行播放,可以出现声音。所以只能分析GO的业务层代码的问题,并对比差异。
分析c EasyStreamClient代码是先各种初始化EasyStreamClient,并设置回调函数;在回调函数中设置EasyRTMP推流参数:EasyRTMP_InitMetadata
而GO业务层都是会先初始化好,向EasyRTMP_InitMetadata填写默认参数,导致里面参数不正确,声音推送错误:
解决此问题,则需要打开流信息,获取到mediainfo的时候把参数设置到EasyRTMP推流中去。修改代码要修改二处:
1、把原来的初始化EasyRTMP_InitMetadata默认参数这个参数注释获取删除:
2、对外暴露一个方法来设置EasyRTMP_InitMetadata函数参数,然后在EasyStreamClient回调函数之后调用: