Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
steven-RD opened this issue Jan 12, 2024 · 11 comments
Open

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

steven-RD opened this issue Jan 12, 2024 · 11 comments

Comments

@steven-RD
Copy link

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

@HuHeng
Copy link
Collaborator

HuHeng commented Jan 12, 2024

可以考虑封装一个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下还有很多关于如何编写模块的示例可以参考。

@steven-RD
Copy link
Author

steven-RD commented Jan 12, 2024

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

@HuHeng
Copy link
Collaborator

HuHeng commented Jan 12, 2024

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

@steven-RD
Copy link
Author

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

@HuHeng
Copy link
Collaborator

HuHeng commented Jan 15, 2024

@steven-RD
Copy link
Author

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的音频数据还是多帧的?

@HuHeng
Copy link
Collaborator

HuHeng commented Jan 16, 2024

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

@steven-RD
Copy link
Author

steven-RD commented Jan 16, 2024

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

@HuHeng
Copy link
Collaborator

HuHeng commented Jan 16, 2024

比如双声道的音频,需要存储到一个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

@steven-RD
Copy link
Author

steven-RD commented Jan 17, 2024

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

@taoboyang
Copy link
Collaborator

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants