用ogg容器封装RTP包中提取的opus payload的实现
Posted
技术标签:
【中文标题】用ogg容器封装RTP包中提取的opus payload的实现【英文标题】:Implementation of encapsulating extracted opus payload from RTP packet with ogg container 【发布时间】:2015-08-03 22:10:11 【问题描述】:我们已经捕获了 pcap 文件,其中包括每个 rfc6716 的 RTP opus 有效负载,现在我们可以切断 RTP 标头并提取 opus 有效负载,我们希望按照规范 https://datatracker.ietf.org/doc/html/draft-ietf-codec-oggopus-07 将有效负载封装到 ogg opus(Ogg 封装用于Opus Audio Codec) 并发送出去,以便 VLC 可以播放捕获的作品,我们不想保存到 ogg 文件然后让 VLC 播放,我们将在封装一个数据包后直接将 ogg 作品发送到 VLC,谁有封装的参考实现,或者我可以参考的第 3 方库?
【问题讨论】:
【参考方案1】:可以使用libpcap 库读取数据包,然后使用libogg 库将其封装在Ogg 中。在opus-tools 包中有一个名为opusrtp
的示例程序,它可以使用libpcap 在环回接口上嗅探Opus RTP 数据包并将它们写入Ogg。您可能想做类似的事情,但是如果您想从 pcap 保存文件中读取,请将 pcap_open_live()
更改为 pcap_open_offline()
,并将 Ogg 页面从 libogg 写入套接字而不是文件。还将OPUS_PAYLOAD_TYPE
定义为您要查找的RTP 有效负载类型。
【讨论】:
抱歉,回复太晚了,虽然我看到 opusrtp 中有一些 API,例如opus_packet_get_samples_per_frame 位于 libopus 库中,ogg_stream_pageout 是 ogg 库,我可以看到 API 文档,但是我找不到 API 的确切实现源代码,你知道我在哪里可以得到它吗?谢谢 @Programmer: opus_packet_get_samples_per_frame() 在opus src/opus.c (docs) 中实现。 ogg_stream_pageout() 在ogg src/framing.c (docs) 中实现。 是的,我看到了那些 API 实现,谢谢。那么,如果捕获的 pcap 有 2 个方向流,一个是从 A 到 B,另一个是从 B 到 A,我们说 2 个人正在通话。每个流都有自己的 rtp 序列,opusrtp 会检查 rtp 是否乱序,如果是,那么 rtp 数据包会被丢弃,我可以将代码修改为不丢弃,但不确定我是否提供了所有这 2 个流 rtp opus 数据包以opusrtp示例程序作为捕获序列,opusrtp仍然可以正常工作并产生良好的.opus文件,目前我没有这样的捕获,对此有什么指导吗? 您可以将每个流写入单独的 opus 流或写入其自己的 .opus 文件。 目的是重现/回放真实的对话场景。将每个流写入其自己的 .opus 文件,我们无法通过基于对话的语音对话使用 VLC 播放,如果将每个流写入单独的 opus 流,我们可以听到语音对话吗?如果这行得通,你知道如何实施吗?从 opusrtp 我看不到这样的功能。【参考方案2】:我也有类似的需求,按照 from this answer 的建议,我编写了一个 opusrtp
的集成,它可以接收 pcap 文件作为输入,然后从中生成 .opus。
要点实际上是使用pcap_open_offline()
而不是pcap_open_live()
,设置正确的有效负载类型,以及一些其他细节以适应输入文件格式。
I have the modified opusrtp in a fork on github.
您可以将它与类似的东西一起使用
./opusrtp --extract PCAPFILE
它会生成rtpdump.opus
,然后您可以根据需要对其进行转换。
【讨论】:
以上是关于用ogg容器封装RTP包中提取的opus payload的实现的主要内容,如果未能解决你的问题,请参考以下文章
从设备发送 NAudio / Opus 编码的音频作为 RTP
在 .NET 中将 Opus (.ogg) 转换为 PCM (.wav)
使用 VLC 从其他计算机上的 ffmpeg 接收 rtp (opus) 流