从零上构建IP上的语音
Building Voice Over IP from zero
我一直在考虑通过IP程序构建一个非常简单的语音,我考虑了通过此操作来创建它:
我将记录麦克风,每2秒钟(或者应该是1秒钟?)将其放入字符串(语音数据),将其通过套接字发送到另一侧,另一侧将自动播放已发送的字符串。
这是主要的想法,尽管我想我会更改一两件事。
主要问题是 - 它足够快吗?我不是在寻找像Skype这样的超快速VoIP,但是很不错...就像2秒Deley(我讲话后,2秒后,另一个人会听到我的声音)或类似的东西...
会很糟糕吗?也许我应该使用一个公开的库来植入VoIP?因为我真的很想用自己的东西做点什么...
顺便说一句,我将使用C ,然后使用UDP协议发送数据包...
那么您怎么看?
我不认为我会做到这一点。一个简单的事实是,在传输之前收集两秒钟(甚至一秒钟)的语音数据会使您失去很多,并且什么也没获得。
与普通的开放协议相比,您可以在许多地方简化协议。典型的协议具有多种选择,用于多种传输速率,存在检测,NAT遍历,多个编解码器等。它们使正常的语音聊天程序相对复杂。通过消除其中的大多数,只是预选了一组选项,您可以大大简化代码。
但是,每几毫秒发送数据包不是很困难的。每隔几秒钟发送每隔几秒钟就不会使您的代码变得更加简单。如果有的话,这可能会使代码更加复杂,因为您必须处理更多的数据。在典型的情况下,您一次只处理几千字节的数据,因此存储几乎完全不是问题。如果您在传输之前存储大量数据,则存储数据将开始成为一个更加实质性的问题(尽管公平地说,这仍然不会非常困难)。
就个人而言,我认为我仍然使用一些标准编解码器,因此,如果您决定这样做,则代码和协议将很容易(或者无论如何,无论如何还是更容易)扩展到更完整的内容。例如,如果我想尽可能简单,我可能会首先使用G.711编解码器。即使是支持两种形式的压缩形式(MU-LAW和A LAW),因此我可能会选择其中一种(可能是法律),然后使用它。
使用它,实际的编解码器(压缩/扩展代码)应在100行代码下(可能接近50行),这取决于您喜欢如何格式化代码)。如果需要,可以从G.191中的ITU下载参考实现(注意:G.191还包括许多其他编解码器的代码)。
可以免费提供一定程度的压缩。关于同样重要的是,这意味着您将构建代码,以便在发送数据之前调用编码器以编码数据,并在收到数据后解码数据。如果您决定增强代码,您最终会选择其他编码器/解码器,而不是尝试添加以前不存在的地方(在这种情况下,您更有可能需要完整的重写)。
G.711旨在一次在样品的缓冲区上操作。支持的缓冲尺寸为40、80、160和320个样品。如果您不关心延迟,那么320个样本将是明显的选择。使用此过程,您可以从输入(麦克风)中读取320个样本,将其发送到压缩机,将结果放入UDP数据包中,然后将其运送到电线上。根据需要重复。您可能想在UDP数据包中包含一个序列编号,因此接收端可以按顺序播放后数据包。同样,我可能会遵循标准。RTP足够微不足道,它可能只添加了另外几十行代码左右(甚至可能比那少)。
为了尽可能简化,接收代码最初可能会忽略整个RTP标头,而只需接收一个数据包,解码有效载荷,播放它并重复。稍后,当/如果发现数据包丢失和重新排序是一个问题时,您可以添加代码以查看序列编号和/或时间戳,并采取相应的行动。
这里的重点是等待2秒(或其他)不会使您的代码变得更简单。如果有的话,一次使用固定数量(相当少的)样本可能会使代码变得更加简单。您可以预先分配您关心的大小的几个缓冲区,然后使用它们,而不是像一次缓冲几秒钟的数据一样处理动态分配。
<</p>如果您在传输音频之前等待2秒钟,那将不会像对话。如果延迟超过100毫秒,大概200毫秒。
,人们会很生气。其次,VOIP应用程序通常是为了与他人交谈。在您的应用程序达到世界上的统治力之前,这可能是一个好主意,这是一个既定的VoIP协议之一(H.323或SIP)的好主意,以便您可以与他人交谈。只是一个想法。
- 我正在开发服务器,ip作为参数传递不起作用
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- 从网址获取 IP (C++)
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- 如何修复无效的API密钥,IP或操作权限错误?
- C++ Winsock2 客户端未通过远程 IP 连接到服务器
- PHP Profiler语言 - 使用 C++ 从 PHP 扩展获取客户端 IP 和 URL
- 为什么 boost::asio::ip::tcp::basic_stream_socket::available 的运行
- 如何使用 libcurl 在本地 IP 上获取 HTML?
- 在C++中使用宏验证 IP 时出错
- 使用 IP 帮助程序的 Windows 中活动 UDP 连接的远程地址
- 将静态 IP 分配给我的 ESP32 服务器后不再响应
- C++ / Qt:如何检测主机名或IP地址何时引用当前系统?
- "acceptor"在从TCP迁移到UDP时不是"boost::asio::ip::udp
- 用于C++的 TCP/IP 解析器和响应器
- cpp / c ++中的grpc客户端代码,元数据x-api-key/x-goog-api-key不起作用,给了我语音A
- 使用 C++将 IP 地址附加到字符*
- 从零上构建IP上的语音