bmf icon indicating copy to clipboard operation
bmf copied to clipboard

BMF框架如何去支持音频流PCM数据的输入

Open steven-RD opened this issue 1 year ago • 11 comments

具体描述:这个音频流的数据并不是从流媒体上获取的,而是通过网络传输去不断接收到的流式数据包,想去实时的编码处理(不能保存为本地文件后再去读取本地文件),请问要去如何实现呢?

steven-RD avatar Jan 12 '24 01:01 steven-RD

可以考虑封装一个bmf module,这个bmf module可以将pcm数据包封装成一个个bmf AudioFrame结构,然后包装成bmf Packet输出。这个module可以对接bmf内置的ffmpeg_encoder模块。

如果你的网络流式数据包能通过ffmpeg拉取,并且需要解码,也可以直接使用bmf内置的ffmpeg_decoder模块做拉流并解码输出的模块。

可以参考一下bmf/demo/broadcaster这个示例。 里面包含如何将pcm构建成为AudioFrame(audiomix.py),如何用ffmpeg_decoder和ffmpeg_encoder进行流的拉取和推送,如何用bmf组建一个graph pipeline。

bmf/test下还有很多关于如何编写模块的示例可以参考。

HuHeng avatar Jan 12 '24 06:01 HuHeng

使用场景是这样的:一路视频输入是读取本地文件,一路音频输入,这路音频是接收websocket通信传递过来的PCM数据包,音频的数据包并不一定是连续的中间可能会没有数据,这个服务要一直运行着随时接收语音包,然后和视频一起做编码,合成既有视频又有音频的流,输出一个实时流。这种场景要怎么实现呢?

steven-RD avatar Jan 12 '24 07:01 steven-RD

可以考虑实现一个bmf 模块,比如叫做WSAudioSourceModule,这个模块实现接收websoceket传递过来的PCM数据包并包装成bmf AudioFrame输出,你可以使用python,golang或者cpp实现这个模块。视频源可以使用ffmpeg_decoder module解码文件输出视频流,编码合成实时流可以使用ffmpeg_encoder模块,WSAudioSourceModule和ffmpeg_decoder module, ffmpeg_encoder module 组成一个graph实现这个场景。

HuHeng avatar Jan 12 '24 08:01 HuHeng

根据你的提示创建了一个bmf 模块,在这个模块中实现接收websoceket传递过来的PCM数据包,如何将这些PCM数据包包装成bmf AudioFrame输出能给具体说说吗?(比如调用哪些接口去实现) @HuHeng

steven-RD avatar Jan 15 '24 06:01 steven-RD

https://babitmf.github.io/docs/bmf/api/api_in_cpp/audio_frame/,可以参考一下文档里的AudioFrame的数据结构和API。 里面包括AudioFrame的构造函数。

HuHeng avatar Jan 15 '24 06:01 HuHeng

data = [] for m in mixed_array: data.append(mp.from_numpy(m)) Log.log(LogLevel.DEBUG, "..........data: ", data.class) mixed_frame = AudioFrame(data, sdk.kLAYOUT_STEREO) 这个是bmf/demo/broadcaster 中的audiomix.py 中的代码片段,请问下这里的data一帧的音频数据还是多帧的音频数据?AudioFrame()返回的mixed_frame是一帧AudioFrame的音频数据还是多帧的?

steven-RD avatar Jan 16 '24 07:01 steven-RD

是一帧,data是list结构,list长度表示声道数量。

HuHeng avatar Jan 16 '24 07:01 HuHeng

现在接收到的流式音频数据为message,将它转化为numpy数组:pcm_array = np.frombuffer(message, dtype=np.int16) 可以如何实现送给AudioFrame()去处理呢?使用的AudioFrame(const TensorList &data, uint64_t layout, bool planer = true)这个接口。

steven-RD avatar Jan 16 '24 10:01 steven-RD

比如双声道的音频,需要存储到一个numpy.array中,它的shape应该是[2, samples], 每个元素类型是np.int16, 你的双声道pcm转换成这样一个numpy.array。然后通过下面的调用转换成为一个AudioFrame

data = []
for m in pcm_array:
data.append(mp.from_numpy(m))
Log.log(LogLevel.DEBUG, "..........data: ", data.class)
audio_frame = AudioFrame(data, sdk.kLAYOUT_STEREO)

有兴趣可以加飞书用户群: https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=3a1la8f6-55fc-4ad4-bdf0-2ec17edd692a

HuHeng avatar Jan 16 '24 10:01 HuHeng

我下载注册了飞书,选择的企业场景需要有企业邀请码,方便提供下吗?还是个人场景?如何加入飞书群

steven-RD avatar Jan 17 '24 03:01 steven-RD

https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=4cev1bee-4d94-42c8-972b-4ae4a12c9da1 您好,个人版这个群可以加了,感谢关注~~ 所有研发人员都在

taoboyang avatar Jan 17 '24 03:01 taoboyang