bmf
bmf copied to clipboard
BMF框架如何去支持音频流PCM数据的输入
具体描述:这个音频流的数据并不是从流媒体上获取的,而是通过网络传输去不断接收到的流式数据包,想去实时的编码处理(不能保存为本地文件后再去读取本地文件),请问要去如何实现呢?
可以考虑封装一个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下还有很多关于如何编写模块的示例可以参考。
使用场景是这样的:一路视频输入是读取本地文件,一路音频输入,这路音频是接收websocket通信传递过来的PCM数据包,音频的数据包并不一定是连续的中间可能会没有数据,这个服务要一直运行着随时接收语音包,然后和视频一起做编码,合成既有视频又有音频的流,输出一个实时流。这种场景要怎么实现呢?
可以考虑实现一个bmf 模块,比如叫做WSAudioSourceModule,这个模块实现接收websoceket传递过来的PCM数据包并包装成bmf AudioFrame输出,你可以使用python,golang或者cpp实现这个模块。视频源可以使用ffmpeg_decoder module解码文件输出视频流,编码合成实时流可以使用ffmpeg_encoder模块,WSAudioSourceModule和ffmpeg_decoder module, ffmpeg_encoder module 组成一个graph实现这个场景。
根据你的提示创建了一个bmf 模块,在这个模块中实现接收websoceket传递过来的PCM数据包,如何将这些PCM数据包包装成bmf AudioFrame输出能给具体说说吗?(比如调用哪些接口去实现) @HuHeng
https://babitmf.github.io/docs/bmf/api/api_in_cpp/audio_frame/,可以参考一下文档里的AudioFrame的数据结构和API。 里面包括AudioFrame的构造函数。
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的音频数据还是多帧的?
是一帧,data是list结构,list长度表示声道数量。
现在接收到的流式音频数据为message,将它转化为numpy数组:pcm_array = np.frombuffer(message, dtype=np.int16) 可以如何实现送给AudioFrame()去处理呢?使用的AudioFrame(const TensorList &data, uint64_t layout, bool planer = true)这个接口。
比如双声道的音频,需要存储到一个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
我下载注册了飞书,选择的企业场景需要有企业邀请码,方便提供下吗?还是个人场景?如何加入飞书群
https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=4cev1bee-4d94-42c8-972b-4ae4a12c9da1 您好,个人版这个群可以加了,感谢关注~~ 所有研发人员都在