背景
原架构是srs接流推到inner, inner是基于brpc实现的rtmp服务器, 架构优化, 需要把inner功能合并到srs.srs接入rtmp流, 对音频为G711的需要转码成aac之后再进行转推, 发现最后出来的音频播放有问题.
现象
wireshark抓包发现前面一部分rtmp body里的音频数据没有改变, 还是原来的G711,后面的rtmp body里面的音频数据有了AAC数据. 但是实际代码中其实已经转码了. 转码结果也可以单独拿出来正常播放.
排查
1、首先查看整个on_audio处理流程, rtmp connection拿到audio之后交给source处理, 转码后的数据enqueue到consumer中, 发送部分consumer dump出来queue中的msg, 直接发送.整体流程上正确. 但是, enqueue的时候create msg的时候, 用的是source中的数组,直接把指针赋值过去了, 这里source是生产者, consumer是消费者, 不在同一个协程, 所以可能会在consumer没有消费这个msg的时候, source会把这块内存覆盖, 导致出错. 这里修改成动态申请就可以了.
2、查看细节, source创建consumer的时候会先把 cache(rtmp aac四个字节音频信息) 和goa_cache(音频数据)enqueue到队列中, 但是gop cache enqueue过程中, enqueue的source 没有转码的G711数据, 所以这里需要修改成转码后的aac_data.