(Ffmpeg) Как с помощью Ffmpeg воспроизводить в браузере живой звук из полученных UDP-пакетов? - PullRequest
0 голосов
/ 25 мая 2020

Есть. NET Базовое консольное приложение, которое действует как UDP-сервер и UDP-клиент

  • UDP-клиент, получая аудиопакет.
  • UDP-сервер, отправляя каждый полученный пакет .

Вот пример кода консольного приложения:

static UdpClient udpListener = new UdpClient();
    static IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.1.230"), 6980);
    static IAudioSender audioSender = new UdpAudioSender(new IPEndPoint(IPAddress.Parse("192.168.1.230"), 65535));

    static void Main(string[] args)
    {
        udpListener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        udpListener.Client.Bind(endPoint);

        try
        {
            udpListener.BeginReceive(new AsyncCallback(recv), null);
        }
        catch (Exception e)
        {
            throw e;
        }

        Console.WriteLine("Press enter to dispose the running service");
        Console.ReadLine();
    }

    private async static void recv(IAsyncResult res)
    {
        byte[] received = udpListener.EndReceive(res, ref endPoint);
        OnAudioCaptured(received);
        udpListener.BeginReceive(new AsyncCallback(recv), null);
    }

С другой стороны, у меня есть приложение node js API, которое предполагает выполнение команды FFmpeg как дочерний процесс и выполнить следующие действия:

  • получить аудиопакет в качестве входных данных от UDP-сервера консольного приложения.
  • преобразовать полученные байты в WebM
  • pipe вывод результата в ответ.

Наконец, на стороне клиента у меня должен быть элемент audio с исходным значением, равным http://localhost: 3000

На данный момент я могу выполнить только эту команду FFmpeg:

ffmpeg -f  s16le  -ar 48000 -ac 2 -i 'udp://192.168.1.230:65535' output.wav

Что делает следующее

  • Получение пакета UDP на входе
  • Преобразование получил байты в аудиофайл output.wav.

Как бы мне exe симпатичный дочерний процесс на сервере node js, который получает пакеты UDP и передает результат в ответ как Webm?

1 Ответ

0 голосов
/ 06 июня 2020

Огромное спасибо Брэду, он направил меня к решению.

На сервере node js мне пришлось сделать следующее:

  • Выполнить Ffmpe как дочерний процесс, который получает пакет UDP в качестве входных данных
  • Передача каждого результата дочернего процесса в ответ.

Вот исходный код сервера node js:

var http = require("http");
var port = 8888;
var host = "localhost";
var children = require("child_process");

http
  .createServer(function (req, res) {
    //ffmpeg -f s16le -ar 48000 -ac 2 -i 'udp://192.168.1.230:65535' -b:a 128k -f webm -
    var ffm = children.spawn(
      "ffmpeg",
      "-f s16le -ar 48000 -ac 2 -i udp://192.168.1.230:65535 -b:a 128k -f webm -".split(
        " "
      )
    );

    res.writeHead(200, { "Content-Type": "audio/webm;codecs=vorbis" });
    ffm.stdout.on("data", (data) => {
      console.log(data);
      res.write(data);
    });
  })
  .listen(port, host);

console.log("Server running at http://" + host + ":" + port + "/");

На стороне клиента:

  <audio src="http://loclahost:8888" type='audio/webm; codecs="vorbis"' controls preload="none"></audio>
...