使用ffmpeg、node.js和socket.io将Flv流传输到套接字

本文关键字:Flv 传输 套接字 io socket ffmpeg node js 使用 | 更新日期: 2023-09-27 18:06:52

所以我在理解如何实现这一点方面遇到了一些问题。我知道流媒体视频是一个很难的话题,有很多要考虑的,但无论如何,我们开始学习如何流媒体视频。

我使用SocketIoClientDotNet作为c#应用程序的node.js客户端。

我正在发送视频的字节数组到正在创建临时文件并将缓冲区附加到它的节点。我试图将视频元素的源设置为该文件,但它没有将其读取为视频,并且都是黑色的。我已经尝试下载该文件的副本,因为它没有工作,事实证明vlc也不能播放它。Ok到代码:

c#

bool ffWorkerIsWorking = false;
private void btnFFMpeg_Click(object sender, RoutedEventArgs e)
{
    BackgroundWorker ffWorker = new BackgroundWorker();
    ffWorker.WorkerSupportsCancellation = true;
    ffWorker.DoWork += ((ffWorkerObj,ffWorkerEventArgs) =>
    {
        ffWorkerIsWorking = true;
        using (var FFProcess = new Process())
        {
            var processStartInfo = new ProcessStartInfo
            {
                FileName = "ffmpeg.exe",
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true,
                Arguments = " -loglevel panic -hide_banner -y -f gdigrab -draw_mouse 1 -i desktop -f flv -"
            };
            FFProcess.StartInfo = processStartInfo;
            FFProcess.Start();
            byte[] buffer = new byte[32768];
            using (MemoryStream ms = new MemoryStream())
            {
                while (!FFProcess.HasExited)
                {
                    int read = FFProcess.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);
                    if (read <= 0)
                        break;
                    ms.Write(buffer, 0, read);
                    clientSocket.Emit("video", ms.ToArray());
                    ms.Flush();
                    if (!ffWorkerIsWorking)
                    {
                        ffWorker.CancelAsync();
                        break;
                    }
                }
            }
        }
    });
    ffWorker.RunWorkerAsync();
}

JS(服务器)

var buffer = new Buffer(32768);
var isBuffering = false;
var wstream;
socket.on('video', function(data) {
    if(!isBuffering){
        wstream = fs.createWriteStream('fooTest.flv');
        isBuffering = true;
    }
    buffer = Buffer.concat([buffer, data]);
    fs.appendFile('public/fooTest.flv', buffer, function (err) {
      if (err) throw err;
      console.log('The "data to append" was appended to file!');
    });
});

我做错了什么?

使用ffmpeg、node.js和socket.io将Flv流传输到套接字

使用OutputDataReceived事件捕获流程标准输出的text输出。这就是为什么在第一种情况下,服务器抱怨UTF-8编码。第二个例子可以工作,因为你发送的是二进制流。

您需要捕获二进制基流。关于如何做到这一点,请参阅以下答案:从Process捕获二进制输出。StandardOutput

我不知道你怎么计划流到底,但如果你使用FLV已经有HTTP/RTMP服务器,你可以使用(例如。