如何在 javascript web 客户端中播放 PCM 流(通过 UDP)?

TJR

我正在编写一个 javascript web 客户端,我想在我的客户端播放从 UDP 流(原始 RTP)编码为 PCM 的音频(我可以自由更改流的目标主机和端口)。如何做呢?

我阅读了 Howler,但找不到任何 UDP 侦听选项或 PCM 支持。我还查看了 WebRTC,但它似乎不支持 PCM(如果我理解正确的话)。

非常感谢!

TJR

所以我终于做到了!我写了一个小的 python 服务器来将 UDP 转换为 websocket。我使用 Quart 编写它,它就像一个异步烧瓶,以使 websocket 和 UDP 选择更容易:

import json
import struct
import socket
import asyncio
from quart import Quart, websocket

app = Quart(__name__)


class PcmServerProtocol:
    def __init__(self, queue: asyncio.Queue):
        self._queue = queue

    def connection_made(self, transport):
        self.transport = transport

    def datagram_received(self, data, addr):
        pcm_chunks = struct.unpack(
            # Convert the data to pulses
            "<" + "h" * (len(data) // struct.calcsize("h")),
            data
        )
        self._queue.put_nowait(json.dumps(pcm_chunks))


async def sending(queue: asyncio.Queue):
    while True:
        data = await queue.get()
        await websocket.send(data)


@app.websocket("/sound")
async def sound():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(("127.0.0.1", 15000))
    pcm_queue = asyncio.Queue()
    streamer = asyncio.create_task(sending(pcm_queue))
    pcm_receiver = asyncio.create_task(
        asyncio.get_event_loop().create_datagram_endpoint(
            lambda: PcmServerProtocol(pcm_queue), sock=sock
        )
    )
    await asyncio.gather(streamer, pcm_receiver)


if __name__ == "__main__":
    app.run()

现在我们只需要连接一个网络套接字并从 javascript 播放声音,为此我使用了网络音频 API:

let audioCtx = new AudioContext();
let ws = new WebSocket('ws://' + document.domain + ':' + location.port + '/sound');
ws.onmessage = function (event) {
    let pcm_chunks = JSON.parse(event.data);
    let node = audioCtx.createBufferSource();
    let buffer = audioCtx.createBuffer(1, pcm_chunks.length, 44100);
    let data = buffer.getChannelData(0);
    for (let i = 0; i < pcm_chunks.length; i++) {
        // Normalize to between -1.0 and 1.0, my PCM was signed 16bit
        data[i] = pcm_chunks[i] / 32768;
    }
    node.buffer = buffer;
    node.loop = false;
    node.connect(audioCtx.destination);
    node.start(0);
};

我发现的一个缺点是通过网络进行操作会使声音滞后,即使在 localhost 上设置它时效果很好。

显然,我们非常欢迎您发表评论并提出其他想法。


编辑:

我实际上找到了使用 vlc(或 cvlc)更好的解决方案。看起来 vlc 可以采用 rtp 流并通过几种操作重新传输它。

cvlc rtp://source_ip:source_port --sout '#transcode{acodec=mp3}:standard{access=http,mux=mp3,dst=dest_ip:dest_port}'

启动该进程时,客户端可以是最简单的 HTML5 音频标签:

<audio controls autoplay>
    <source src="http://dest_ip:dest_port" type="audio/mp3">
</audio>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用C#中的Avro框架通过UDP客户端发送流obj

来自分类Dev

我想通过 udp 客户端发送大量 udp 消息,我该如何实现?

来自分类Dev

如何在Web Worker中访问客户端URL?

来自分类Dev

Gstreamer udp-source pcm播放

来自分类Dev

如何在javascript中检测客户端的向后导航?

来自分类Dev

如何在客户端Javascript中隐藏API密钥

来自分类Dev

如何在Docker容器中运行JavaScript客户端?

来自分类Dev

如何通过Web客户端访问TCP套接字

来自分类Dev

如何在系统中设置默认Web浏览器,邮件客户端,视频播放器和音乐播放器

来自分类Dev

如何在系统中设置默认Web浏览器,邮件客户端,视频播放器和音乐播放器

来自分类Dev

如何在JavaScript中播放超声波WAV / PCM文件而不丢失数据

来自分类Dev

如何通过Visual Studio中的客户端javascript项目访问服务器的webapi项目

来自分类Dev

如何通过 OpenCV 处理 VLC UDP 流

来自分类Dev

如何在python中处理UDP套接字客户端

来自分类Dev

如何在Java的udp(client,server)程序中为客户端设置端口号?

来自分类Dev

如何转换PCM音频流以进行在线播放

来自分类Dev

如何在UDP无连接客户端中的固定端口上运行客户端程序-Java中的服务器对

来自分类Dev

UDP 客户端服务器:通过 WAN 使用

来自分类Dev

如何从Web监控中删除sensu客户端

来自分类Dev

如何在Android中通过套接字建立客户端到客户端语音呼叫

来自分类Dev

Web Audio API:有效地播放PCM流

来自分类Dev

如何在POSTAL MVC中而不在WEB.Config中设置SMTP客户端

来自分类Dev

如何在.Net中的WCF客户端Web服务调用中包括CDATA部分?

来自分类Dev

如何在不从服务器发送数据包的UDP客户端中设置超时?

来自分类Dev

如何使用客户端Javascript从DynamoDB中读取项目?

来自分类Dev

如何在ASP.NET Web API内存测试中添加客户端证书?

来自分类Dev

如何在单向ASMX Web服务中获取客户端IP地址

来自分类Dev

如何在客户端应用程序中访问Web服务?

来自分类Dev

如何在Azure云服务中为我的API和Web客户端设置SSL?

Related 相关文章

  1. 1

    使用C#中的Avro框架通过UDP客户端发送流obj

  2. 2

    我想通过 udp 客户端发送大量 udp 消息,我该如何实现?

  3. 3

    如何在Web Worker中访问客户端URL?

  4. 4

    Gstreamer udp-source pcm播放

  5. 5

    如何在javascript中检测客户端的向后导航?

  6. 6

    如何在客户端Javascript中隐藏API密钥

  7. 7

    如何在Docker容器中运行JavaScript客户端?

  8. 8

    如何通过Web客户端访问TCP套接字

  9. 9

    如何在系统中设置默认Web浏览器,邮件客户端,视频播放器和音乐播放器

  10. 10

    如何在系统中设置默认Web浏览器,邮件客户端,视频播放器和音乐播放器

  11. 11

    如何在JavaScript中播放超声波WAV / PCM文件而不丢失数据

  12. 12

    如何通过Visual Studio中的客户端javascript项目访问服务器的webapi项目

  13. 13

    如何通过 OpenCV 处理 VLC UDP 流

  14. 14

    如何在python中处理UDP套接字客户端

  15. 15

    如何在Java的udp(client,server)程序中为客户端设置端口号?

  16. 16

    如何转换PCM音频流以进行在线播放

  17. 17

    如何在UDP无连接客户端中的固定端口上运行客户端程序-Java中的服务器对

  18. 18

    UDP 客户端服务器:通过 WAN 使用

  19. 19

    如何从Web监控中删除sensu客户端

  20. 20

    如何在Android中通过套接字建立客户端到客户端语音呼叫

  21. 21

    Web Audio API:有效地播放PCM流

  22. 22

    如何在POSTAL MVC中而不在WEB.Config中设置SMTP客户端

  23. 23

    如何在.Net中的WCF客户端Web服务调用中包括CDATA部分?

  24. 24

    如何在不从服务器发送数据包的UDP客户端中设置超时?

  25. 25

    如何使用客户端Javascript从DynamoDB中读取项目?

  26. 26

    如何在ASP.NET Web API内存测试中添加客户端证书?

  27. 27

    如何在单向ASMX Web服务中获取客户端IP地址

  28. 28

    如何在客户端应用程序中访问Web服务?

  29. 29

    如何在Azure云服务中为我的API和Web客户端设置SSL?

热门标签

归档